copy-and-swap惯用法与异常安全
解释copy-and-swap惯用法(Copy-and-Swap Idiom)如何实现强异常安全保证。operator=通过传值再swap的实现方式相比传统方式有什么优势?
回答
屠龙少年
Copy-and-swap通过传值接受参数(拷贝或移动),再与当前对象swap。代码:T& operator=(T other) { swap(*this, other); return *this; }。当传参导致拷贝抛出异常时,当前对象不受影响(强保证)。swap本身不抛出。优势:①统一处理拷贝赋值和移动赋值——传值时,左值拷贝构造、右值移动构造,编译器自动选择;②代码复用——减少重复赋值逻辑;③异常安全——所有可能失败的拷贝都发生在修改当前对象之前。swap通常实现为非抛出friend函数(friend void swap(T& a,T& b) noexcept { using std::swap; swap(a.ptr, b.ptr); })。注意:RAII类中资源指针适合copy-and-swap;大型容器可能因深拷贝开销不适用,此时用传统赋值更优。