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.csdn.net/m0_37166947/article/details/72856841
https://zhuanlan.zhihu.com/p/391558669
https://www.cnblogs.com/Patt/p/10476911.html