(copy-and-swap イディオムを使用して) クラスを作成するときの一般的なガイドラインは、スローしないスワップ メンバー関数を提供することです。( Effective C++、第 3 版、項目 25およびその他のリソース)
ただし、クラスがスワップ操作を提供しないサードパーティ クラス メンバーを使用しているために、nothrow 保証を提供できない場合はどうなりますか?
// Warning: Toy code !!!
class NumberBuffer {
public:
...
void swap(NumberBuffer& rhs);
public:
float* m_data;
size_t m_n;
CString m_desc;
};
void swap(NumberBuffer& lhs, NumberBuffer& rhs) {
lhs.swap(rhs);
}
void NumberBuffer::swap(NumberBuffer& rhs) {
using std::swap;
swap(m_data, rhs.m_data);
swap(m_n, rhs.m_n);
swap(m_desc, rhs.m_desc); // could throw if CString IsLocked and out-of-mem
}
CString スワップを非スローにすることはできないため、スワップが失敗する可能性は低いです。
注: まれなサード パーティ クラスでは、スマート ptr (pimpl) を使用することもできますが、 -
注: CString は良い例です。彼の正気 (?) の誰も、pimpl (smart ptr) を介して CString のような概念的に単純でユビキタスなクラスのすべてのメンバーを保持し始めることはありません。 CString を変更して完全にノースロー スワップを許可する (短期から中期) チャンスはありません。
それで、あなたがそれを助けることができないなら、スワップメンバー関数をスローする可能性があっても大丈夫ですか? (または、この難問を回避する方法を知っていますか?)
編集:そして:強力な保証ではない場合、基本的な保証を提供するために、スロースワップメンバーをコピーアンドスワップイディオムで使用できますか?