C ++中各种类型初始化的目的是什么?正确的是什么?
int i1 = 1;
int i2(1);
int i3{};
int i4 = {1};
int i5 = int{1};
答案 0 :(得分:11)
int i1 = 1;
这是很好的旧C风格。仍然可以正常工作,在C ++中是常规的。
int i2(1);
这是C ++风格。它的出现是因为某些类型的构造函数需要多个参数。
int i3{};
C ++ 11风格。
int i4 = {1};
这不是传统的。
int i5 = int{1};
这不是传统的。但是由于新的"统一初始化语法"它得到了支持。 C ++ 11。
int i6 = {};
你没有问过这个,但它在C ++ 11中也有效。
int i7{1};
另一个好处是,这可能是C ++ 11中统一初始化语法的最常规用法。
auto i8 = int{1};
感谢KerrekSB对这种令人憎恶的看法,他除了Herb Sutter之外别无他法。这可能会赢得#34; No True Modern C ++"露营,疏远你的同事,他们对第一种语法非常满意。
答案 1 :(得分:4)
TL; DR - 使用X a1 {v};
进行初始化。
要从Bjarne Stroustrup本人获取提示,下面直接引用TCPL,第四版 -
如果为对象指定了初始化程序,则该初始值设定项确定对象的初始值。 初始化程序可以使用四种语法样式之一:
X a1 {v};
X a2 = {v};
X a3 = v;
X a4(v);
其中,只有第一个可以在每个上下文中使用,我强烈建议使用。它更清楚 并且比替代品更不容易出错。但是,第一种形式(用于a1)在C ++ 11中是新的,所以 其他三种形式是您在旧代码中找到的形式。使用=的两种形式是你使用的 下进行。