C++ 初始化列表中的初始化器\u列表

C++ 初始化列表中的初始化器\u列表,c++,c++11,initializer-list,initialization-list,C++,C++11,Initializer List,Initialization List,我想用std::initializer\u list初始化基类 struct A : public std::array<int, 4> { // This constructor works fine A() : std::array<int, 4>{{ 1, 2, 3, 4 }} { } // THIS CONSTRUCTOR FAILS TO COMPILE A(std::initializer_list<int> il)

我想用
std::initializer\u list
初始化基类

struct A : public std::array<int, 4>
{
  // This constructor works fine
  A()
  : std::array<int, 4>{{ 1, 2, 3, 4 }}
  {
  }

  // THIS CONSTRUCTOR FAILS TO COMPILE
  A(std::initializer_list<int> il)
  : std::array<int, 4>{il}
  {
  }
};

并将其传递给基类。

这意味着
数组可以像在第一个ctor中那样用“括号内的初始值设定项”进行初始化,但不能像在第二个ctor中那样用
初始值设定项列表进行初始化。没有接受初始值设定项列表的数组构造函数。事实上,除了隐式声明的特殊成员函数外,数组没有任何构造函数。

std::array
没有采用
std::initializer\u列表的构造函数

struct A : public std::array<int, 4>
{
  // This constructor works fine
  A()
  : std::array<int, 4>{{ 1, 2, 3, 4 }}
  {
  }

  // THIS CONSTRUCTOR FAILS TO COMPILE
  A(std::initializer_list<int> il)
  : std::array<int, 4>{il}
  {
  }
};
你唯一的方法就是这样做:

#include <array>
#include <initializer_list>

struct A : public std::array<int, 4>
{
    A()
    : std::array<int, 4>{{ 1, 2, 3, 4 }}
    {
    }

    A(std::array<int, 4> il)
    : std::array<int, 4>(il)
    {
    }
};

int main ()
{
    A a ({{ 1, 2, 3, 4 }});
}
#包括
#包括
结构A:公共std::数组
{
()
:std::数组{{1,2,3,4}
{
}
A(std::阵列il)
:std::数组(il)
{
}
};
int main()
{
A({1,2,3,4}});
}

似乎std::initializer\u list在这里隐式地强制转换为std::array。这会影响运行时性能吗?这里使用的不是std::initializer\u列表:
std::array
uses。引用:[std::array]将C样式数组的性能和可访问性与标准容器[…]@Chnossos的优点结合在一起,虽然可以使用列表初始化来初始化数组,但不能使用实际的
初始化器\u list
对象来初始化数组。Try:
auto-il={1,2,3};阵列a(il)那么我们应该对固定大小的对象使用聚合初始化,对可变大小的对象使用初始值设定项列表吗?@ShitImplementor只有在存在接受初始值设定项列表对象的ctor时,才可以使用初始值设定项列表对象。至于性能惩罚,对于移动构造函数来说,这应该不是问题。