通过枚举值构造initializer_list包含随机值

Zer*_*ges 7 c++ initializer-list c++11

在考虑问题std :: initializer list的解决方案时,从现有的std :: array而不枚举每个元素,我开发了类似bolov做的机制,但没有构造对象,而只是初始化列表.我很惊讶我的解决方案不起作用,我无法弄清楚原因.

#include <initializer_list>
#include <iostream>
#include <array>

template<typename T, std::size_t N, std::size_t... Is>
std::initializer_list<T> array_to_init_list_helper(std::array<T, N> arr, std::index_sequence<Is...>)
{
    return {arr[Is]...};
}

template<typename T, std::size_t N>
std::initializer_list<T> array_to_init_list(std::array<T, N> arr)
{
    return array_to_init_list_helper(arr, std::make_index_sequence<N>{});
}

int main()
{
    std::array<int, 5> arr{1, 2, 3, 4, 5};
    auto init_list = array_to_init_list(arr);
    for (auto val : init_list)
        std::cout << val << " ";
}
Run Code Online (Sandbox Code Playgroud)

得到随机值,而我希望得到的值arr.

Jon*_*nas 1

通过此处(clang 4.0.0)和/或此处(GCC 7.1)的汇编,很明显使用的std::initializer_list是悬空指针,它(众所周知)产生看似随机的输出。

编辑

这个结果当然与Igor Tandetnik引用cppreference.com的评论一致:

底层数组是 const T[N] 类型的临时数组,其中每个元素都是从原始初始化器列表的相应元素复制初始化的(除了缩小转换无效)。底层数组的生命周期与任何其他临时对象相同,除了从数组初始化一个initializer_list对象会延长数组的生命周期,就像将引用绑定到临时对象一样(有相同的例外,例如初始化一个非-静态类成员)。底层数组可以分配在只读存储器中。