为什么这会调用默认构造函数?

时间:2012-07-27 15:31:50

标签: c++ syntax most-vexing-parse

struct X
{
    X()    { std::cout << "X()\n";    }
    X(int) { std::cout << "X(int)\n"; }
};

const int answer = 42;

int main()
{
    X(answer);
}

我原本预计会打印

  • X(int),因为X(answer);可以被解释为从intX
  • 的演员表
  • 什么都没有,因为X(answer);可以被解释为变量的声明。

然而,it prints X(),我不知道为什么X(answer);会调用默认构造函数。

奖励积分:我需要更改什么才能获得临时而非变量声明?

3 个答案:

答案 0 :(得分:73)

  

什么都没有,因为X(回答);可以解释为变量的声明。

你的答案隐藏在这里。如果声明一个变量,则调用它的默认ctor(如果是非POD和所有那些东西)。

在您的编辑中:要获得临时性,您可以选择以下几种方法:

答案 1 :(得分:65)

括号是可选的。你所说的与X answer;相同,这是一个声明声明。

答案 2 :(得分:9)

如果要声明X类型的变量,则应该这样做:

X y(answer);