C++ 为什么这会调用默认构造函数? struct X { 括号是可选的。您所说的与X answer;相同,是一个声明语句

C++ 为什么这会调用默认构造函数? struct X { 括号是可选的。您所说的与X answer;相同,是一个声明语句,c++,syntax,most-vexing-parse,C++,Syntax,Most Vexing Parse,什么都没有,因为X(答案);可以解释为变量的声明 你的答案隐藏在这里。如果你声明了一个变量,你就调用它的默认ctor(如果是非POD之类的) 在编辑时:要获得临时文件,您有几个选项: (C++11) (C++11,可能产生副本) 如果要声明类型为X的变量,应按以下方式执行: struct X { X() { std::cout << "X()\n"; } X(int) { std::cout << "X(int)\n"; }

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

你的答案隐藏在这里。如果你声明了一个变量,你就调用它的默认ctor(如果是非POD之类的)

在编辑时:要获得临时文件,您有几个选项:

  • (C++11)
  • (C++11,可能产生副本)

如果要声明类型为X的变量,应按以下方式执行:

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

const int answer = 42;

int main()
{
    X(answer);
}

X((int)answer);但是会产生正确的结果。@JTA最后,
X(int(answer));
不会打印任何内容,因为它是一个函数声明:)什么都没有,因为X(answer);可以解释为变量的声明。该声明也是一个定义,它会触发默认构造函数的执行…这反过来意味着您回答了自己的问题。@David
double(expresso)
好了,就为你声明;)@FredOverflow:我必须要一个定义才能使用它,因为我觉得没有效果……他没有问如何让它调用
X(int)“但是我有一个小的感觉,那就是他要做的事情:”沃特:事实上,认识弗莱德,这是不可能的。他是那些喜欢探索C++标准黑暗角落并试图理解它的人之一。在某个RPG中,他已经失去了所有的心智健全点;“<代码>静态的转换(答案))
感觉到了“大多数C++”的答案——它甚至被一个老的建议作为强制右值的一种方式。大括号初始值设定项不也可能会产生副本吗?@rubenvb:为什么会?这只是一种新奇的说法
X(答案)
,并保证了一个ctor调用。@Xeo:因为大括号初始值设定项语法按值取其参数?(@KerrekSB但肯定只有在C++11之前,不是吗?现在,标准答案将是
X{answer}
X y(answer);