Existe-t-il un moyen de forcer «l’parsing la plus compliquée» à être une erreur, même classe par classe?

Est-il possible (avec toute modification de classe A) d’avoir le travail suivant? c’est-à-dire, faire l’parsing la plus frustrante, une erreur?

class A { }; int main() { A a(); // can this be forced to be an error?? A b; // this should work } 

Aucune modification de la classe A n’aura d’effet sur la manière dont une déclaration A a(); est analysé. L’parsingur détermine qu’il s’agit d’une déclaration de fonction avant même de regarder la définition de A En fait, la définition de A n’a même pas besoin d’être visible pour parsingr cette déclaration; Une déclaration anticipée suffit.

Cependant, les compilateurs ont généralement un avertissement à ce sujet et vous pouvez probablement le transformer en erreur. Par exemple, avec clang, vous pouvez utiliser le drapeau -Werror = vexing-parse .

 struct A; A a(); // no error int main() { A a(); // error } 

clang ++ -std = c ++ 11 -Weverything -Werror = vexing-parse main.cpp

 main.cpp:6:8: error: empty parentheses interpreted as a function declaration [-Werror,-Wvexing-parse] A a(); ^~ main.cpp:6:8: note: replace parentheses with an initializer to declare a variable A a(); ^~ {} 1 error generated. 

Bien que techniquement parlant, a A a(); la syntaxe n’est-elle pas connue sous le nom d’parsing la plus épineuse? Ce serait:

 A a(B()); 

Il n’existe aucun moyen dans la spécification de langue actuelle qui pourrait transformer ce code en erreur. Normalement, vous obtenez juste un message d’erreur amusant lorsque vous essayez d’utiliser “l’object”. Cependant, certains compilateurs mettent en garde sur la situation (par exemple, clang):

 clang++ -W -Wall -Werror -c -o vexing.o vexing.cpp vexing.cpp:5:8: error: empty parentheses interpreted as a function declaration [-Werror,-Wvexing-parse] A a(); // can this be forced to be an error?? ^~