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

Why does this call the default constructor?

提问人:fredoverflow 提问时间:7/27/2012 最后编辑:curiousguyfredoverflow 更新时间:9/23/2012 访问量:2565

问:

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);

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

C++ 语法 most-vexing-parse

评论

1赞 Inisheer 7/27/2012
X((int)答案);但是,会产生正确的结果。
2赞 fredoverflow 7/27/2012
@JTA 最后,不打印任何东西,因为它是一个函数声明:)X(int(answer));
1赞 David Rodríguez - dribeas 7/27/2012
什么都没有,因为 X(answer); 可以解释为变量的声明。该声明也是一个定义,它触发默认构造函数的执行......这反过来意味着你回答了自己的问题。
6赞 fredoverflow 7/28/2012
@David你去吧,宣布只为你;)double(expresso);
2赞 David Rodríguez - dribeas 7/28/2012
@FredOverflow:我必须需要一个定义才能使用它,因为我感觉没有效果......

答:

67赞 Kerrek SB 7/27/2012 #1

括号是可选的。你说的和 是一样的,它是一个声明语句。X answer;

73赞 Xeo 7/27/2012 #2

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

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

在编辑时:要获得临时信息,您有以下几种选择:

评论

4赞 Kerrek SB 7/28/2012
感觉是“最C++”的答案 - 它甚至被旧的GCC文档推荐为强制右值的一种方式。static_cast<X>(answer)
0赞 rubenvb 7/28/2012
大括号初始值设定项是否也会产生副本?
0赞 Xeo 7/28/2012
@rubenvb:为什么会这样?这只是一种花哨的新说法,并保证了 ctor 调用。X(answer)
0赞 rubenvb 7/28/2012
@Xeo:因为大括号初始值设定项语法按值获取其参数?(<-注意问号)
4赞 Konrad Rudolph 7/28/2012
@KerrekSB 但肯定只在 C++11 之前,不是吗?现在,规范的答案将是 。X{answer}
9赞 huysentruitw 7/27/2012 #3

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

X y(answer);

评论

1赞 Xeo 7/27/2012
他没有问如何让它打电话给ctor。X(int)
0赞 huysentruitw 7/27/2012
是的,但我有一种小小的感觉,这是他想做的事情:)
6赞 Matthieu M. 7/28/2012
@WouterH:实际上,认识弗雷德,这不太可能。他是那些喜欢探索C++标准的黑暗角落并试图理解它的人之一。在某个角色扮演游戏中,他已经失去了所有的理智点;)