是否有可能(对 A 类进行任何修改)进行以下工作?即,使最令人头疼的解析错误?
class A {
};
int main() {
A a(); // can this be forced to be an error??
A b; // this should work
}
是否有可能(对 A 类进行任何修改)进行以下工作?即,使最令人头疼的解析错误?
class A {
};
int main() {
A a(); // can this be forced to be an error??
A b; // this should work
}
类的修改不会对如何解析A
声明产生任何影响。A a();
解析器在它甚至费心查看A
. 事实上A
,解析这个语句甚至不需要可见的定义;前向声明就足够了。
但是,编译器通常会对此发出警告,您可能会将其变成错误。例如,使用 clang 您可以使用 flag -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.
虽然从技术上讲A a();
并不是最令人烦恼的解析语法。那将是:
A a(B());
当前的语言规范中没有任何方法可以使此代码出错。通常,当您尝试使用“对象”时,您只会收到一条有趣的错误消息。但是,一些编译器确实会警告这种情况(例如 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??
^~