C++ most vexing parse
今天在ROS tutorial的示例代码中见到了一个写法,类似于:
class Test {
Test();
};
Test::Test() {
// do something
}
int main() {
Test a();
}
之后在自己的实验中会发现,Test a()这行代码并没有执行Test的构造函数,但是也没报错。比较费解,尝试了很多办法,最后还是搜索引擎告诉我这叫most vexing parse,说人话就是C++标准对于一些带有歧义的声明语句的定义与常人的理解相悖。Test a();在我们的理解中是说要使用构造函数创建一个Test实例a,但是C++标准把这种语句定义为函数声明,即定义一个Test class的无参数的方法a。
大致的理解是这样,更详细的可以查看:
《Effective STL》
https://stackoverflow.com/questions/17713124/what-does-a-a-mean
https://stackoverflow.com/questions/5926103/most-vexing-parse
https://blog.youkuaiyun.com/m0_37166947/article/details/72856841
https://zhuanlan.zhihu.com/p/391558669
https://www.cnblogs.com/Patt/p/10476911.html
C++中的most vexing parse是一个语法陷阱,它会导致编译器将看似对象实例化的语句解释为函数声明。例如,`Testa();`在实际中会被解析为函数`Testa`的无参数声明,而非预期的Test类实例创建。这个问题可以通过使用括号明确指定构造函数调用来避免,如`Test a();`或`Test a;`。理解这一现象对于避免不必要的错误至关重要。
449

被折叠的 条评论
为什么被折叠?



