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

Why does this call the default constructor?

本文关键字:默认 构造函数 调用 为什么      更新时间:2023-10-16
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);可以解释为变量的声明。

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

奖励积分:我必须更改什么才能获得临时声明而不是变量声明?

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

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

关于您的编辑:要获得临时,您有以下几种选择:

  • (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 类型的变量,你应该这样做:

X y(answer);