是否可以(对A类进行任何修改)进行以下工作?即,使最令人烦恼的解析出错?
class A {
};
int main() {
A a(); // can this be forced to be an error??
A b; // this should work
}
答案 0 :(得分:5)
对A
类的修改不会对声明A a();
的解析方式产生任何影响。在解析A
的定义之前,解析器确定这是一个函数声明。事实上,A
的定义甚至不需要在解析这个陈述时可见;前瞻声明就足够了。
然而,编译器通常会对此发出警告,您可能会将其转换为错误。例如,使用clang,您可以使用标志 -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());
答案 1 :(得分:1)
当前的语言规范中没有办法使这段代码成为错误。通常,当您尝试使用“对象”时,您只会收到一条有趣的错误消息。但是,一些编制者会对这种情况发出警告(例如铿锵声):
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??
^~