为什么这称为默认构造函数?


80
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);要调用默认构造函数。

优点:要获得临时声明而不是变量声明,我需要更改什么?


1
X((int)answer); 但是会产生正确的结果。
Inisheer

2
@JTA最后,X(int(answer));什么也不打印,因为它是一个函数声明:)
fredoverflow 2012年

1
根本没有,因为X(answer); 可以解释为变量的声明。该声明也将是一个定义,它将触发默认构造函数的执行……这又意味着您回答了自己的问题。
大卫·罗德里格斯(DavidRodríguez)-德里贝斯

6
@Daviddouble(expresso);你去了,只为你宣布;)
fredoverflow 2012年

2
@FredOverflow:我必须需要一个定义来使用它,因为我感觉没有效果...
dribeas大卫-罗德里格斯

Answers:


73

根本没有,因为X(answer); 可以解释为变量的声明。

您的答案隐藏在这里。如果声明变量,则调用其默认ctor(如果是非POD以及所有其他东西)。

编辑时:要得到一个临时选项,您有几种选择:


4
static_cast<X>(answer)感到“最C ++”的答案-它甚至由一个老建议GCC文档,以此来迫使右值。
Kerrek SB 2012年

大括号初始化器是否也可能会产生副本?
rubenvb

@rubenvb:为什么呢?这只是一种新颖的说法,X(answer)而且可以保证调用ctor。
Xeo 2012年

@Xeo:因为大括号初始化器语法按值接受参数?(<-注意问号)
rubenvb 2012年

4
@KerrekSB但是肯定只有在C ++ 11之前,对吗?现在,规范的答案将是X{answer}
康拉德·鲁道夫

66

括号是可选的。您所说的与相同X answer;,这是一条声明语句。


9

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

X y(answer);

1
他没有问如何称呼它为X(int)ctor。
Xeo 2012年

是的,但我有一点感觉,这就是他想做的事情:)
huysentruitw 2012年

6
@WouterH:实际上,认识弗雷德,这不太可能。他是喜欢探索C ++标准的黑暗角落并尝试理解它的人之一。在某个RPG中,他已经失去了所有理智点;)
Matthieu M.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.