我可以使用std::initializer_list
对象而不是大括号括起初始化程序来初始化数组吗?
众所周知,我们可以这样做:http://en.cppreference.com/w/cpp/language/aggregate_initialization
unsigned char b[5]{"abc"};
// equivalent to unsigned char b[5] = {'a', 'b', 'c', '\0', '\0'};
int ar[] = {1,2,3};
std::array<int, 3> std_ar2{ {1,2,3} }; // std::array is an aggregate
std::array<int, 3> std_ar1 = {1, 2, 3};
但是我无法通过std::initializer_list il;
初始化数组:
#include <iostream>
#include <initializer_list>
#include <array>
int main() {
int arr1[] = { 1, 2, 3 }; // OK
std::array<int, 3> arr2 = { 1, 2, 3 }; // OK
std::initializer_list<int> il = { 1, 2, 3 };
constexpr std::initializer_list<int> il_constexpr = { 1, 2, 3 };
//int arr3[] = il; // error
//int arr4[] = il_constexpr; // error
//std::array<int, 3> arr5 = il; // error
//std::array<int, 3> arr6 = il_constexpr; // error
return 0;
}
但是如何使用std::initializer_list il;
初始化数组呢?
答案 0 :(得分:6)
据我所知,不是:您无法使用std::array
初始化std::initializer_list
。
问题是std::array
旨在作为经典C风格数组的轻量级替换(包装器)。所以没有构造函数的光,所以只能使用隐式构造函数。
使用聚合初始化(通过隐式构造函数)的构造是可能的,因为它可以用于C风格的数组。
但是std::initializer_list
是一个类,比聚合的原始化更复杂。
例如,您可以使用std::vector
初始化std::initializer_list
但仅因为std::vector
有一个明确的构造函数,它会收到std::initializer_list
。但std::vector
是一个较重的类。
我看到的唯一解决方案是两步:(1)构造和(2)std::initializer_list
值的复制。像
std::array<int, 3> arr5;
auto ui = 0U;
auto cit = il.cbegin();
while ( (ui < arr5.size()) && (cit != il.cend()) )
arr5[ui++] = *cit++;
p.s:抱歉我的英语不好。
答案 1 :(得分:2)
The problem with std::array
is that it is required to be an aggregate type, hence it does not have constructors.
Hence only aggregate initialization or trivial copy are possible.
std::initializer_list
is a class other than std::array
, so a (missing) implicit conversion is required.
See http://en.cppreference.com/w/cpp/language/aggregate_initialization and http://en.cppreference.com/w/cpp/container/array for reference.