主要观点:介绍了std::initializer_list
在 C++中的不良声誉及相关问题,包括引用局部数组可能导致未定义行为、复制元素的成本、不支持不可复制类型以及栈空间和大列表的问题等,并给出了替代方案(可变参数函数)和相关提案,最后总结并提供资源供参考。
关键信息:
std::initializer_list
会扩展为无名的局部const
对象数组,使用时需注意避免返回和传递导致的生命周期问题。- 传递
std::initializer_list
给std::vector
构造函数时,每个元素都需要复制。 - 对于不可复制类型,如
unique_ptr
,initializer_list
无法处理,需使用emplace_back
或push_back
。 - C++26 可解决大列表导致的栈溢出问题,编译器可自动将初始化列表的临时数组放置在静态存储中。
- 可变参数函数可减少临时对象数量,处理不可复制类型。
重要细节: - GCC 和 Clang 会在相关代码中给出警告。
- 展示了不同初始化方式的代码示例及输出,如使用
initializer_list
和emplace_back
的对比。 - 提到了相关提案及进展,如 David Krauss 的提案和 Arthur 的提案等。
资源: - initializer_list class - Microsoft Learn
- The cost of
std::initializer_list
- Andrzej Krzemieński
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。