コピー アンド スワップ イディオムは、強力な例外保証を提供すると言われています。しかし、C++11 では、std::swap は移動操作を使用します。
次のコードを検討してください。
class MyClass
{
AClass x;
CanThrowIfMoved throwingObject;
MyClass(MyClass&& other) noexcept
x(std::move(other.x)),
throwingObject(std::move(other.throwingObject))
{ }
friend void swap(MyClass& first, MyClass& second) noexcept
{
using std::swap;
swap(first.x, other.x);
swap(first.throwingObject, other.throwingObject);
}
MyClass& operator=(MyClass other) noexcept
{
swap(*this, other);
return *this;
}
};
throwingObject
スワップ中に がスローされると、強い例外の保証が破られます。
キーワードは、noexcept
コンパイル時に何も強制しません。throwingObject
まだスローできますが、唯一の違いは、プログラムが激しくterminate
. 例外が発生したときにアプリケーション全体をクラッシュさせることは、強力な例外保証とは見なされません。
これは、コピー アンド スワップが C++11 で強力な例外保証を強制しなくなったことを意味しますか?
類似の質問
この質問は似ていますが、標準ライブラリの使用を対象としています。コピー アンド スワップ イディオムの強力な例外保証にとって、この問題が何を意味するのかに興味があります。
この質問では、コピー アンド スワップ イディオムでの使用方法について説明しますnoexcept
が、コピーについてのみ説明します。問題があると思われるスワップではありません。