在我的环境中,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/