【发布时间】: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