我以前从未在C ++中遇到过这个问题,但奇怪的是它仍然编译但是没有达到我的预期。有人能告诉我它做了什么吗?请参阅代码,更多信息如下。
#include <iostream>
using namespace std;
class Test{
public:
Test();
};
Test::Test(){ cout << "ctor" << endl; }
int main(void){
Test t(); // this compiles but doesn't call the constructor
return(0);
}
它会编译,但如果我尝试使用“t”则不会。我只依赖于构造函数,我的代码没有按预期工作。解决方案是丢失括号“Test t();” “测试t;”。我的问题是“测试t();”例如,编译器认为它正在发生什么,它允许它编译。</ p>
答案 0 :(得分:5)
这是Most Vexing Parse。基本上,根据C ++解析规则,你所拥有的不是名为Test
的{{1}}类型的对象,而是函数t
的函数声明,它接受零参数和返回t
。
顺便说一句,clang ++实际上会识别出这种情况并发出警告,告诉你这可能不是你想要的。
答案 1 :(得分:1)
这是一个常见问题,恰如其分地命名为最令人烦恼的解析。您的第Test t();
行可以用两种方式解释。
t
Test
t()
,它返回Test
值并且不带参数不幸的是,C ++标准要求编译器考虑第二种选择,这是一个非常令人烦恼的解析。
解析修复的最简单方法是摆脱括号并简单地声明你的变量:
Test t; // Will call the default constructor