我可以使用std :: initializer_list而不是大括号括起初始化器来初始化数组吗?

时间:2016-08-13 11:13:21

标签: c++ c++11 c++14 initializer-list c++17

我可以使用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;初始化数组:

http://ideone.com/f6aflX

#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;初始化数组呢?

2 个答案:

答案 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.