在C ++中实例化一个类:奇怪的语法错误

时间:2012-12-18 02:38:27

标签: c++ compiler-construction

我以前从未在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>

2 个答案:

答案 0 :(得分:5)

这是Most Vexing Parse。基本上,根据C ++解析规则,你所拥有的不是名为Test的{​​{1}}类型的对象,而是函数t的函数声明,它接受零参数和返回t

顺便说一句,clang ++实际上会识别出这种情况并发出警告,告诉你这可能不是你想要的。

答案 1 :(得分:1)

这是一个常见问题,恰如其分地命名为最令人烦恼的解析。您的第Test t();行可以用两种方式解释。

  1. 它可以声明t
  2. 类型的变量Test
  3. 它可以声明一个函数t(),它返回Test值并且不带参数
  4. 不幸的是,C ++标准要求编译器考虑第二种选择,这是一个非常令人烦恼的解析。

    解析修复的最简单方法是摆脱括号并简单地声明你的变量:

    Test t; // Will call the default constructor