我已经经历“ ℃的旅游++ ”和Bjarne的使用了C ++ 11初始化列表功能,在成员初始化在构造函数中,像这样(用大括号):
A a;
B b;
Foo(Bar bar):
a{bar.a}, b{bar.b}
{}
然而这并不C ++ 11之前编译。 是什么与旧成员初始化列表(使用圆括号)的区别:
Foo(Bar bar):
a(bar.a), b(bar.b)
{}
那么有什么不同,当应一个优于其他?
我已经经历“ ℃的旅游++ ”和Bjarne的使用了C ++ 11初始化列表功能,在成员初始化在构造函数中,像这样(用大括号):
A a;
B b;
Foo(Bar bar):
a{bar.a}, b{bar.b}
{}
然而这并不C ++ 11之前编译。 是什么与旧成员初始化列表(使用圆括号)的区别:
Foo(Bar bar):
a(bar.a), b(bar.b)
{}
那么有什么不同,当应一个优于其他?
那么区别是什么呢?
圆形耳只对非类类型,或类型与合适的构造函数的参数在括号中的数字工作。
波浪括号工作这些,也为骨料-简单struct
或数组类型没有构造函数。 所以,下面的工作:
struct {
int a,b;
} aggregate;
int array[2];
Foo() : aggregate{1,2}, array{3,4} {}
最后,大括号将匹配一个构造采取适当类型的initializer_list
,而不是与参数(S)来匹配参数的构造函数。 例如:
std::vector<int> v1;
std::vector<int> v2;
Foo() :
v1(10,2), // 10 elements with value 2
v2{10,2} // 2 elements with value 10,2
{}
当应一个比其他优选?
体型圆括弧,如果你想更清楚地表明初始化使用构造函数,而不是聚集或initializer_list
; 或强制使用特定构造的。
身高:括号当你需要初始化,否则不支持的一种形式; 或者当你只是想初始化“做正确的事”。
在情况下,都做同样的事情,选择在很大程度上是审美。
可以有一些非常恼人的边缘案件的区别:
std::vector<int> v{3, 2}; // constructs a vector containing [3, 2]
std::vector<int> u(3, 2); // constructs a vector containing [2, 2, 2]
无论的这才是真正的v
和u
都只是一个函数变量或者是在初始化列表初始化一个类的成员。
但情况外,其中一个std::initializer_list<T>
构造与通常的构造以相同的数量的参数,没有差别重叠。
简短的描述是:在成员初始化列表的符号匹配的变量初始化别处。 可悲的是,它所做的说明是不容易,因为在所有有两个与使用的构造函数调用花括号中有些冲突的变化:
std::initializer_list<T>
不需要额外的一对括号/花括号。 如果有一个构造服用std::initializer_list<T>
为一个合适的类型T
)此构造是用大括号时使用。 换句话说,如果不存在std::initializer_list<T>
构造函数,但一些其他用户定义的构造使用括号和大括号的是等效的。 否则,它调用std::initializer_list<T>
构造函数。 ......我猜,我错过了几个细节,整个初始化实际上是相当复杂的。