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.
通过此处(clang 4.0.0)和/或此处(GCC 7.1)的汇编,很明显使用的std::initializer_list是悬空指针,它(众所周知)产生看似随机的输出。
编辑
这个结果当然与Igor Tandetnik引用cppreference.com的评论一致:
底层数组是 const T[N] 类型的临时数组,其中每个元素都是从原始初始化器列表的相应元素复制初始化的(除了缩小转换无效)。底层数组的生命周期与任何其他临时对象相同,除了从数组初始化一个initializer_list对象会延长数组的生命周期,就像将引用绑定到临时对象一样(有相同的例外,例如初始化一个非-静态类成员)。底层数组可以分配在只读存储器中。
| 归档时间: |
|
| 查看次数: |
199 次 |
| 最近记录: |