6

我以前从未在 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;”。我的问题是“Test t();”中发生了什么 例如,编译器认为正在发生什么让它编译。

4

2 回答 2

5

这是最令人头疼的 Parse。基本上,根据 C++ 解析规则,你所拥有的不是类型Test为 named的对象t,而是一个函数声明,t它接受零参数并返回一个Test.

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

于 2012-12-18T02:40:59.967 回答
1

这是一个常见的问题,被恰当地称为最令人头疼的解析。您的行Test t();可以通过以下两种方式之一进行解释。

  1. 它可以声明一个t类型为Test
  2. 它可以声明一个函数t(),该函数返回一个Test值并且不接受任何参数

不幸的是,C++ 标准要求编译器考虑第二种选择,这是一个非常令人烦恼的解析。

修复该解析的最简单方法是去掉括号并简单地声明您的变量:

Test t; // Will call the default constructor
于 2012-12-18T02:49:49.933 回答