C++ 2/2 中的 std::initializer_list - 注意事项和改进

主要观点:介绍了std::initializer_list在 C++中的不良声誉及相关问题,包括引用局部数组可能导致未定义行为、复制元素的成本、不支持不可复制类型以及栈空间和大列表的问题等,并给出了替代方案(可变参数函数)和相关提案,最后总结并提供资源供参考。
关键信息:

  • std::initializer_list会扩展为无名的局部const对象数组,使用时需注意避免返回和传递导致的生命周期问题。
  • 传递std::initializer_liststd::vector构造函数时,每个元素都需要复制。
  • 对于不可复制类型,如unique_ptrinitializer_list无法处理,需使用emplace_backpush_back
  • C++26 可解决大列表导致的栈溢出问题,编译器可自动将初始化列表的临时数组放置在静态存储中。
  • 可变参数函数可减少临时对象数量,处理不可复制类型。
    重要细节:
  • GCC 和 Clang 会在相关代码中给出警告。
  • 展示了不同初始化方式的代码示例及输出,如使用initializer_listemplace_back的对比。
  • 提到了相关提案及进展,如 David Krauss 的提案和 Arthur 的提案等。
    资源:
  • initializer_list class - Microsoft Learn
  • The cost of std::initializer_list - Andrzej Krzemieński
阅读 15
0 条评论