std::vector::assign是否具备强异常安全保证?代码场景问询
std::vector::assign 针对平凡类型的异常安全性分析
#include <vector> #include <array> int main() { std::vector<int> v; std::array<int, 500> b{}; v.assign(b.begin(), b.end()); }
核心结论
v.assign(b.begin(), b.end()) 针对int这类平凡可复制类型,具备强异常安全保证——操作要么完全成功,要么容器回到执行前的初始状态。
疑问拆解与分析
1. 内存分配的异常情况
当std::vector需要为新元素分配内存时,若分配失败会抛出std::bad_alloc。但这个分配操作是在修改容器原有状态之前执行的:如果内存分配失败,vector的旧数据不会被触动,完全保留操作前的状态。
2. 元素复制阶段的异常风险
你担心的“部分赋值后容器不一致”的情况,在int这类具备noexcept复制语义的类型下不会发生:
int的复制构造函数是noexcept的,标准库实现会针对这类类型做优化,先完成内存分配,再批量复制所有元素。- 由于
int的复制操作不可能抛出异常,所以不存在复制到一半中断的场景,自然不会出现容器处于部分修改的不一致状态。
标准库的通用规则补充
std::vector::assign的异常保证取决于元素的复制/移动操作是否可能抛出:
- 若元素的复制/移动操作可能抛出异常,
assign仅提供基本异常安全保证——容器不会泄漏资源,但可能处于部分修改的状态。 - 若元素的复制/移动操作是noexcept的,
assign提供强异常安全保证——操作要么完全成功,要么容器回到初始状态。
内容的提问来源于stack exchange,提问作者user24551355
相关产品推荐
相关产品推荐

