保留 std::initializer_list 的副本是否安全?理由是什么
Can it be safe to keep a copy of an std::initializer_list? What is the rationale?
在我的
环境中,std::initializer_list
被实现为指向第一个元素的指针和一个大小。仍然在我的特定设置中,我能够观察到:
- 基础数据在当前函数框架中分配(因为指向第一个元素的指针是这样说的)
- 从函数返回
initializer_list
BY 值不会更改指针的值(导致数据未与initializer_list一起复制的结论)。
这使得复制initializer_list
变得不安全,如果复制可以比原始对象存活。
- 此行为是否会通过进一步发布 C++ 标准来维持?
- 同样重要的是,这种行为背后的理由是什么?(今天它咬得很重,所以我会天真地说它违背了心爱的"最小惊讶"原则)
从 C++11 标准 18.9 [support.initlist]:
2 类型 initializer_list 的对象提供对 const E 类型的对象数组的访问。 [ 注意:一对指针或指针加上一个长度将是initializer_list的明显表示。 initializer_list用于实现 8.5.4 中指定的初始值设定项列表。复制初始值设定项列表不会复制基础元素。— 尾注 ]
这就像将指针指向对象。还可以使指针比对象更持久。如果你想"安全地"做到这一点,请取/存储一个元素向量。
复制元素会使它变得昂贵,因此没有人会使用它。可用的文档非常清楚地说明了它的作用。
编辑:
这是Stroustrup对initializer_list
:N2100的建议。阅读它可能会启发它的设计决策。
相关文章:
- 通过网络、跨平台传递std::变体是否安全
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 在函数结束后使用指向变量的指针是否安全?
- 逐字节删除 void* 是否安全?
- 在 RAII 构造中修改 RVO 值是否安全?
- 线程调用的函数对对象删除是否安全?
- 将对象的字节复制到数组并再次复制回来是否安全
- std::memmove在同一对象之间是否始终安全
- 使用枚举为数组编制索引是否安全?
- 返回从字符串文本创建的静态string_view是否安全?
- 在cstlib中将#include_next替换为#include是否安全
- 由并发无序映射查找线程调用的函数是否安全?
- 使用 c++ 原子时编写"y=++x"是否安全?
- 从另一个线程发出信号是否安全?
- 从其存储的回调中删除 std::函数是否安全
- 使用 std::vector::swap 方法在C++中交换两个不同的向量是否安全?
- 当我在C++中调用 struce 的只读静态成员时,线程是否安全
- 同时调用 ASIO 对象的 API 是否安全?