C++ 11:std :: initializer_list是否存储匿名数组?它可变吗?

Hin*_*sum 0 arrays anonymous mutable initializer-list c++11

C++标准是否说这std::initializer_list<T>是对本地匿名数组的引用?如果它说,那么我们永远不应该返回这样的对象.标准中的任何部分都这样说了吗?

另一个问题是,一个std::initializer_list<T>可变的基础对象?我试着修改它:

#include <initializer_list>
int main()
{
    auto a1={1,2,3};
    auto a2=a1;//copy or reference?
    for(auto& e:a1)
        ++e;//error
    for(auto& e:a2)
        cout<<e;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但编译错误:错误:只读参考'e'的增量

如果我想更改initializer_list中的值,我该如何解决?

Bar*_*rry 5

来自[dcl.init.list]:

类型的对象std::initializer_list<E>是从初始化列表构造的,就好像实现分配了一个临时N的类型元素数组const E,其中N是初始化列表中元素的数量.使用初始化列表的相应元素对该数组的每个元素进行复制初始化,并std::initializer_list<E>构造该对象以引用该数组.

这应该回答你的两个问题:复制initializer_list不复制底层元素,底层元素是const你不能修改它们.

如果我想更改内部的值,我该如何解决initializer_list

不要使用initializer_list<int>.使用一个array<int, 3>vector<int>其他容器.