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

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); 可以被解释为variables的声明。

但是, 它打印X() ,我不知道为什么X(answer); 会调用默认的构造函数。

奖励点:我需要改变什么才能获得临时而不是variables声明?

一无所有,因为X(答案); 可以被解释为variables的声明。

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

在您的编辑:要获得暂时的,你有几个select:

  • (X(answer));
  • (X)answer;
  • static_cast<X>(answer)
  • X{answer}; (C ++ 11)
  • []{ return X(answer); }(); (C ++ 11,可能会复制)
  • void(), X(answer);
  • X((void(),answer));
  • true ? X(answer) : X();
  • if(X(answer), false){}
  • for(;X(answer), false;);
  • X(+answer);

括号是可选的。 你所说的和X answer;是一样的X answer; ,这是一个声明声明。

如果你想声明一个Xtypes的variables,你应该这样做:

 X y(answer);