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

fre*_*low 80 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);
}
Run Code Online (Sandbox Code Playgroud)

我本来希望这打印

  • X(int),因为X(answer);可以解释为铸件从intX,或
  • 什么都没有,因为X(answer);可以解释为变量的声明.

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

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

Xeo*_*Xeo 73

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

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

在你的编辑:要获得一个临时的,你有几个选择:

  • `static_cast <X>(回答)`感觉"最C++"的答案 - 它甚至被旧的[GCC文档]推荐(http://gcc.gnu.org/onlinedocs/gcc-4.0.2/gcc/ Volatiles.html)作为强制左值的一种方式. (4认同)
  • @KerrekSB但肯定只有在C++ 11之前,没有?现在,规范的答案将是"X {answer}". (4认同)

Ker*_* SB 65

括号是可选的.你说的是完全相同的X answer;,这是一份声明.


huy*_*itw 9

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

X y(answer);
Run Code Online (Sandbox Code Playgroud)

  • @WouterH:实际上,知道弗雷德,这不太可能.他是那些喜欢探索C++标准的黑暗角落并尝试理解它的人之一.在某个角色扮演游戏中他已经失去了所有的理智点;) (6认同)