0

コピー アンド スワップ イディオムは、強力な例外保証を提供すると言われています。しかし、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が、コピーについてのみ説明します。問題があると思われるスワップではありません。

4

1 に答える 1