1
votes

l'utilisation du mot "not" comme nom de classe c ++ provoque une erreur sur VS2019

Je migre un projet existant vers VS2019. Ayant une structure très simple qui a été compilée avec succès dans toutes les versions précédentes:

template <class Marker>
struct not
{
    // ...

erreur C2332: 'struct': nom de balise manquant

NOTE-1 J'ai vérifié par génération de pré-compilation que non n'est pas remplacé par certaines macros, sortie de * .i correspond entièrement à la déclaration ci-dessus

NOTE-2 bien sûr si je renomme not-> inv alors tout va bien


5 commentaires

Vérifiez eel.is/c++draft/lex.key#2 : la représentation alternative non est réservée et ne doit pas être utilisée autrement .


not est un mot-clé en C et C ++ en.cppreference.com / w / cpp / language / operator_alternative , il est étrange que cela ait fonctionné avant


@RoQuOTriX: en effet. La question ne devrait pas être "Pourquoi cela donne-t-il une erreur maintenant?" mais "Pourquoi cela n'a-t-il pas donné d'erreur avant?".


@Dewfy consultez ceci pour plus d'informations - stackoverflow.com/questions/2376448/...


@walnut - s'il vous plaît, faites-le comme une réponse - puisque vous êtes le seul à avoir un point "comment résoudre". Merci!


3 Réponses :


4
votes

not est un mot-clé en C ++, il ne peut pas être utilisé comme nom de classe.

Consultez la liste des mots clés sur cppreference.


0 commentaires

5
votes

not est un opérateur alternatif pour ! , c'est-à-dire un mot-clé C ++ et, par conséquent, il ne peut pas être utilisé dans la dénomination.

Consultez la documentation .


0 commentaires

3
votes

not est un mot-clé en C ++ standard qui peut être utilisé comme alternative pour le jeton ! .

MSVC ne prend pas en charge les jetons d'opérateur alternatifs par défaut. Par conséquent, ils sont disponibles comme identifiants et vous n'obtenez pas d'erreur sur votre déclaration.

Mais en mode de conformité avec l'indicateur de compilateur / permissive- , ces jetons sont considérés comme des mots-clés avec leur signification standard et ne sont donc pas disponibles comme identifiants.

Je suggère de ne pas utiliser not comme identifiant, même si vous n'utilisez pas le mode de conformité, car cela rend votre code non standard et non portable.

Voir https://docs.microsoft. com / fr-fr / cpp / build / reference / permissive-standards-conformance

et Pourquoi VS ne définit-il pas le jetons alternatifs pour les opérateurs logiques?


0 commentaires