Ale*_*zov 8 c++ c++11 c++14 stdinitializerlist c++17
我想将一个可变参数类型列表"实现"到相关值的initializer_list中.例如,有std::tuple几个std::integral_constant<T, x>得到一个std::initializer_list<T>{...}.一般情况下,我想得到一些复杂类型的initializer_list,比如std::string.
但是下面这个简单的例子让我在Clang编译时崩溃了(虽然它适用于GCC,至少在Coliru上),所以我怀疑UB(或Clang中的bug):
template <class... Ts>
std::initializer_list<const std::string> materialize()
{
return {
std::to_string(Ts::value)...
};
}
void print_out()
{
for (const auto & x : materialize<std::true_type, std::false_type>()) {
std::cout << x << "\n";
}
}
Run Code Online (Sandbox Code Playgroud)
那么,这样的代码合法吗?在C++ 11/14/17中?
关于initializer_list的两件事:
初始化器列表可以实现为一对指针或指针和长度.复制std :: initializer_list 不会复制 基础对象.
和
在原始初始化程序列表对象的生存期结束后,不保证基础数组存在.std :: initializer_list的存储是未指定的(即它可以是自动,临时或静态只读存储器,具体取决于具体情况).
所以在这一行
return {
std::to_string(Ts::value)...
};
Run Code Online (Sandbox Code Playgroud)
你正在创建本地数组,initializer_list保持指向这个数组的开头/结尾的指针,当函数超出范围你有悬空指针.
| 归档时间: |
|
| 查看次数: |
249 次 |
| 最近记录: |