【问题标题】:Initialization of std::array with std::initializer_list in constructor's initialization list [duplicate]在构造函数的初始化列表中使用 std::initializer_list 初始化 std::array [重复]
【发布时间】:2015-09-04 19:58:18
【问题描述】:

考虑以下代码:

struct foo {
  std::vector<int> v;
  foo(std::initializer_list<int> L) : v{L} {}
};

上面的代码编译正常并按预期初始化v。现在考虑以下代码:

struct bar {
  std::array<int, 3> a;
  bar(std::initializer_list<int> L) : a{L} {}
};

上面的代码给出了编译错误。

错误:没有从 'std::initializer_list' 到 'int' 的可行转换

在网上搜索我发现用std::list_initializer 初始化成员std::array 的“正确”方法是按以下方式使用reinterpret_cast

bar(std::initializer_list<int> L) : a(reinterpret_cast<std::array<int, 3> const&>(*(L.begin()))) {}

问:

为什么我可以在构造函数的初始化列表中使用std::initializer_list 初始化成员std::vector,但我不能成为成员std::array

上面使用reinterpret_cast 显示的解决方法是用std::initializer_list 初始化成员std::array 的正确方法吗?

【问题讨论】:

  • std::array 除了编译器提供的构造函数之外,没有任何构造函数。
  • 强制转换很危险,因为初始化列表包含的项目可能比数组少。

标签: c++ c++11 stl initializer-list stdarray


【解决方案1】:
foo(std::initializer_list<int> L) : v{L} {}

std::vector 有一个构造函数,它接受 std::initializer_list 作为输入。因此,您正在初始化向量本身,而不是 std::vector 的任何特定元素。

bar(std::initializer_list<int> L) : a{L} {}

std::array没有接受std::initializer_list作为输入的构造函数(实际上它根本没有任何构造函数,只能通过aggregate initialization初始化)。因此,您试图初始化数组的特定元素,这就是编译器抱怨它无法将 std::initializer_list 转换为 int 的原因。

【讨论】:

    【解决方案2】:

    std::arraydesigned (in the Boost library) 以支持 C++03 的大括号初始化语法。在 C++03 中做到这一点的唯一方法是作为 POD(普通旧数据)类型,一种没有构造函数的类型。在 C++11 中引入了初始化列表以及 std::array,但 std::array 并未从其 Boost 版本更改为使用初始化列表。所以,这是历史性的。

    顺便提一下,reinterpret_cast 在这里很危险,因为初始化列表包含的项目可能比array 少。

    【讨论】:

      【解决方案3】:

      std::array 是 C++ 数组的薄包装器,如下所示

      template<typename T, size_t N>
      struct {
        T data[N];
      }
      

      因此它没有任何构造函数能够处理std::initializer_list,您必须坚持使用vector 或在构造函数中使用其他内容(如std::copy)复制元素。

      【讨论】:

        猜你喜欢
        • 2018-01-13
        • 1970-01-01
        • 2016-12-22
        • 1970-01-01
        • 2017-05-02
        • 2016-02-16
        • 1970-01-01
        • 2015-12-29
        • 1970-01-01
        相关资源
        最近更新 更多