使用C ++ 11在构件初始化列表初始化列表语法使用C ++ 11在构件初始化列表初始化列表语法(I

2019-05-11 19:48发布

我已经经历“ ℃的旅游++ ”和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)
{}

那么有什么不同,当应一个优于其他?

Answer 1:

那么区别是什么呢?

圆形耳只对非类类型,或类型与合适的构造函数的参数在括号中的数字工作。

波浪括号工作这些,也为骨料-简单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 ; 或强制使用特定构造的。

身高:括号当你需要初始化,否则不支持的一种形式; 或者当你只是想初始化“做正确的事”。

在情况下,都做同样的事情,选择在很大程度上是审美。



Answer 2:

可以有一些非常恼人边缘案件的区别:

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]

无论的这才是真正的vu都只是一个函数变量或者是在初始化列表初始化一个类的成员。

但情况外,其中一个std::initializer_list<T>构造与通常的构造以相同的数量的参数,没有差别重叠。



Answer 3:

简短的描述是:在成员初始化列表的符号匹配的变量初始化别处。 可悲的是,它所做的说明是不容易,因为在所有有两个与使用的构造函数调用花括号中有些冲突的变化:

  1. 统一初始化语法目的是使使拥有所有建筑使用大括号,它只是调用对应的构造,即使是默认参数或类型没有构造在所有和使用直接初始化。
  2. 为了支持可变数目的参数中,花括号可用于提供std::initializer_list<T>不需要额外的一对括号/花括号。 如果有一个构造服用std::initializer_list<T>为一个合适的类型T )此构造是用大括号时使用。

换句话说,如果存在std::initializer_list<T>构造函数,但一些其他用户定义的构造使用括号和大括号的是等效的。 否则,它调用std::initializer_list<T>构造函数。 ......我猜,我错过了几个细节,整个初始化实际上是相当复杂的。



文章来源: Initializer list syntax in member initializer list using C++11