有没有办法强制"most vexing parse"是错误的,即使是逐个类?

Is there a way to force the "most vexing parse" to be an error, even on a class by class basis?

本文关键字:即使是 错误 parse most 有没有 vexing      更新时间:2023-10-16
是否有

可能(对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,您可以使用标志 -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??
      ^~