【问题标题】:initializer_list in initialization list初始化列表中的 initializer_list
【发布时间】:2014-04-13 01:26:30
【问题描述】:

我想用std::initializer_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}
  {
  }
};

第二个构造函数的 GCC 错误是

错误:数组必须用大括号括起来的初始化器进行初始化

我想要的是像这样用 initializer_list 初始化新的 A 实例

A var{{ 1, 2, 3, 4 }}

并将其传递给基类。

【问题讨论】:

    标签: c++ c++11 initializer-list initialization-list


    【解决方案1】:

    std::array 类没有构造函数采用std::initializer_list

    你唯一的办法就是这样做:

    #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 }});
    }
    

    【讨论】:

    • 似乎 std::initializer_list 在这里被隐式转换为 std::array 。这会对运行时性能产生影响吗?
    • 这里使用的不是 std::initializer_list :std::array 使用 aggregate_initialization。引用 cppreference[std::array] 结合了 C 样式数组的性能和可访问性与标准容器的优点 [...]
    • @Chnossos,虽然可以使用列表初始化来初始化数组,但无法使用实际的initializer_list 对象对其进行初始化。试试:auto il = {1,2,3}; array&lt;int,3&gt; a(il);
    • 那么我们应该对固定大小的事物使用aggregate_initialization,对可变大小的事物使用initializer_list吗?
    • @ShitImplementor 如果有一个接受一个的ctor,您只能使用一个initializer_list 对象。至于性能损失,使用移动构造函数应该不是问题。
    【解决方案2】:

    这是说 array 可以像在您的第一个 ctor 中那样使用“大括号封闭的初始化程序”进行初始化,但不能像在您的第二个 ctor 中那样使用 initializer_list 进行初始化。没有采用 initializer_list 的数组 ctor。实际上,除了隐式声明的特殊成员函数之外,数组没有任何 ctors。

    【讨论】:

      猜你喜欢
      • 2016-12-22
      • 1970-01-01
      • 1970-01-01
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多