c++ - 在构造函数的初始化列表中使用 std::initializer_list 初始化 std::array

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

<分区>

考虑以下代码:

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} {}
};

上面这段代码给出了一个编译错误。

error: no viable conversion from 'std::initializer_list' to '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::arraydesigned (in the Boost library)支持 C++03 的大括号初始化语法。在 C++03 中做到这一点的唯一方法是作为 POD(普通旧数据)类型,一种没有构造函数的类型。初始化列表在 C++11 中与 std::array 一起引入,但 std::array 并未从其 Boost 版本更改为使用初始化列表。所以,这是历史性的。

顺便说一句,请注意 reinterpret_cast 在这里很危险,因为初始化列表包含的项目可能少于 array

关于c++ - 在构造函数的初始化列表中使用 std::initializer_list 初始化 std::array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30927900/

相关文章:

c++ - 使用智能指针跟踪可能被删除的数据成员

c++ - 如何检测鼠标点击 QLineEdit

c++ - map 中的段错误

c++ - 程序在不使用数组的情况下查找 5 个数字中的最大和最小

c++ - vector 复制不起作用,但手动 push_back 可以

c++ - 我在一些指针上遇到了问题,调试结束时访问位置失败

c++ - 为什么 std::atomic 初始化不进行原子释放,以便其他线程可以看到初始化值?

c++ - ISO C++ 禁止声明没有自动迭代器类型的 ‘it’?

c++ - 嵌套类的值初始化

c++ - 如何使用alignas替换pragma pack?