4

是否有可能(对 A 类进行任何修改)进行以下工作?即,使最令人头疼的解析错误?

class A {
};

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

2 回答 2

5

类的修改不会对如何解析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());
于 2013-09-25T15:56:11.887 回答
1

当前的语言规范中没有任何方法可以使此代码出错。通常,当您尝试使用“对象”时,您只会收到一条有趣的错误消息。但是,一些编译器确实会警告这种情况(例如 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??
      ^~
于 2013-09-25T15:57:54.740 回答