有没有办法强制"most vexing parse"是错误的,即使是逐个类?
Is there a way to force the "most vexing parse" to be an error, even on a class by class basis?
是否有
可能(对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??
^~
相关文章:
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 我的固定时间步长与增量时间和插值的解决方案是错误的吗?
- 构建挂起,即使是适度的文件大小
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- 以相反的顺序打印数组 - 为什么这在C++中是错误的?
- 反转字符串.不知道为什么这个逻辑是错误的.C++
- 我无法在某个点(从用户那里)获得输入,即使没有错误弹出编译
- 分配给浮点数的积分文字除法 - 为什么结果是错误的?
- 错误在哪里,为什么这个程序是错误的?
- numeric_limits在BOOST_STRONG_TYPEDEF上是错误的
- 我得到了一个没有被忽略的无效值,因为它应该是错误的,为什么
- Qt中的QFile::copy(source,dest)的实现有时是错误的吗?
- 为什么'allocate in one library and free in the other'是错误的
- 使用分而治之的最大总和子数组,为什么要以不同的方式使用 for 循环,答案是错误的?
- 为什么这种在数组中导航的方法是错误的?
- 为什么双算的结果是错误的?
- 线性全余生成器的分析是错误的吗?
- C 程序如果功能中的语句不执行.在逻辑上似乎是错误的
- C++删除数组,即使发生错误也是如此
- 有没有办法强制"most vexing parse"是错误的,即使是逐个类?