是否有办法迫使“最令人烦恼的解析”成为一个错误,即使是逐班?

时间:2013-09-25 15:38:51

标签: c++ most-vexing-parse

是否可以(对A类进行任何修改)进行以下工作?即,使最令人烦恼的解析出错?

class A {
};

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

2 个答案:

答案 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??
      ^~