提问人:fredoverflow 提问时间:7/27/2012 最后编辑:curiousguyfredoverflow 更新时间:9/23/2012 访问量:2565
为什么这会调用默认构造函数?
Why does this call the default constructor?
问:
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);
int
X
- 什么都没有,因为可以解释为变量的声明。
X(answer);
但是,它打印 X(),
我不知道为什么要调用默认构造函数。X(answer);
奖励积分:我必须更改什么才能获得临时声明而不是变量声明?
答:
67赞
Kerrek SB
7/27/2012
#1
括号是可选的。你说的和 是一样的,它是一个声明语句。X answer;
73赞
Xeo
7/27/2012
#2
什么都没有,因为 X(答案);可以解释为变量的声明。
你的答案就藏在这里。如果你声明了一个变量,你调用它的默认ctor(如果非POD和所有这些东西)。
在编辑时:要获得临时信息,您有以下几种选择:
(X(answer));
(X)answer;
static_cast<X>(answer)
X{答案};
(C++11)[]{ 返回 X(answer);();
(C++11,可能会产生复制)void(), X(answer);
X((void(),answer));
true ? X(answer) : X();
if(X(answer), false){}
for(;X(answer), false;);
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++标准的黑暗角落并试图理解它的人之一。在某个角色扮演游戏中,他已经失去了所有的理智点;)
评论
X(int(answer));
double(expresso);