c++ - 保留 std::initializer_list 的拷贝是否安全?这是什么道理?

标签 c++ c++11 c++14 initializer-list

在我的环境中,std::initializer_list 被实现为指向第一个元素和大小的指针。仍然在我的特定设置中,我能够观察到:

  • 底层数据在当前函数帧中分配(因为指向第一个元素的指针是这样说的)
  • 从函数按值返回 initializer_list 不会更改指针的值(得出数据未与 initializer_list 一起复制的结论)。

这使得复制 initializer_list 变得不安全,如果拷贝的生命周期比原始对象长

  • C++ 标准的进一步发布是否会维持这种行为?
  • 同样重要的是,这种行为背后的基本原理是什么? (今天真的很痛,所以我会天真地说这违背了“最不惊讶”的原则)

最佳答案

来自 C++11 标准,18.9 [support.initlist]:

2 An object of type initializer_list provides access to an array of objects of type const E. [ Note: A pair of pointers or a pointer plus a length would be obvious representations for initializer_list. initializer_list is used to implement initializer lists as specified in 8.5.4. Copying an initializer list does not copy the underlying elements. — end note ]

这就像获取指向对象的指针。您还可以使指针比对象长寿。如果您想“安全地”执行此操作,请改为获取/存储元素 vector 。

复制元素会使它变得昂贵,因此没有人会使用它。 documentation available非常清楚它的作用。

编辑:

这是 Stroustrup 对 initializer_list 的提议:N2100 .阅读它可能会启发其设计决策。

关于c++ - 保留 std::initializer_list 的拷贝是否安全?这是什么道理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27157202/

相关文章:

c++ - 简单的 boost 提交;建议?

c++ - 如何在同一单位中使用具有比率的 Boost.Unit

c++ - 带有 OpenGl 的 Centos 7 上的 Qt 无法正常工作

c++ - OpenMP 指针

c++ - 在双向链表中使用智能指针

c++ - 如何在没有复制构造函数的情况下初始化类的静态实例>

c++ - C++ `new` 运算符可以在现实生活中抛出异常吗?

c++ - 在释放互斥锁之前或之后通知消费者线程?

c++ - 解压模板模板函数的可变参数?

C++ 编译时检查微 Controller 引脚是否已从其他源文件初始化