隐式生成的初始化列表构造函数

时间:2015-09-11 11:06:26

标签: c++ c++11 constructor

std::array的C ++标准中,它说:

  

数组是一个聚合(8.5.1),可以用它初始化   语法

     

数组a = {initializer-list};

     

其中initializer-list是   逗号分隔的最多N个元素的列表,其类型是可转换的   到T。

它还说std::array是一种聚合类型,它的构造函数是隐式生成的。

要使用初始化列表初始化std::array,必须使用构造函数将std::initializer_list作为参数。

构造函数是否也为用户定义的类型隐式生成了std::initializer_list,或者它是否特定于std::array

3 个答案:

答案 0 :(得分:5)

不,编译器生成一个std::initializer_list的构造函数,既不用于std::array也不用于任何其他聚合类型。

您在此处观察到的是aggregate initialization,它与std::initializer_list完全无关。

您提供的标准代码段中的“初始化列表”一词是指初始值设定项列表,它与std::initializer_list无关。

您可以使用以下内容进行测试:

struct A {
    int i;
    std::string str;
};

int main() {
    A a{1, "asdf"};
}

这很有效,但显然没有使用std::initializer_list,因为它只能同时处理单个类型。

答案 1 :(得分:1)

std::array是聚合的,因此使用聚合初始化,并且不会生成接收std::initializer_list的构造函数。

  

如果初始化程序是(非括号内的) braced-init-list ,   对象或引用是列表初始化的(8.5.4)。

     

列表初始化是从a初始化对象或引用   支撑-INIT列表。这样的初始化程序称为初始化列表,   和列表中以逗号分隔的 initializer-clauses 称为   初始化列表的元素

     

对象或类型T的引用的列表初始化定义为   如下:

     

如果T是聚合,则执行聚合初始化(8.5.1)。

     

按指定的初始化列表初始化聚合时   在8.5.4中,初始化列表的元素被视为   增加下标的聚合成员的初始化程序   或会员订单。每个成员都是从中复制初始化的   相应的 initializer-clause

答案 2 :(得分:0)

编辑:

语法适用于聚合类型

#include <iostream>
using namespace std;

struct A {
    int a;
    int b;
    int get_a() {return a;}
};

int main() {
    A a1({4,5});
    A a2{1,2};
    cout << a1.a << '\n';
    cout << a2.b << '\n';
    return 0;
}

Live

但从技术上讲,对于聚合类型,没有创建构造函数。这些调用呈现两种形式的list initialization。由于T是一个聚合,因此它属于aggregate initialization相关项目符号。