7
struct A
{
    A(int x)
        : n(x)
    {}

    A(A&&)
    {}

    A& operator =(A&&)
    {
        return *this;
    }

    int n;
};

int main()
{
    A a(1), b(2);

    a = b;

    if (2 == a.n)
    {
        // It SHOULD go here!
    }
}

C++ 標準 12.8.7 に従って:

クラス定義でムーブ コンストラクターまたはムーブ代入演算子が宣言されている場合、暗黙的に宣言されたコピー コンストラクターは削除済みとして定義されます。

および 12.8.18

クラス定義でムーブ コンストラクターまたはムーブ代入演算子が宣言されている場合、暗黙的に宣言されたコピー代入演算子は削除済みとして定義されます。

ステートメントa = b;は、コンパイラ エラーをトリガーする必要があります。ただし、私のコンパイラ (VC++ 2013 RC) はそれを受け入れ、代わりに暗黙的に定義されたコピー代入を呼び出します。

これはコンパイラのバグですか?

アップデート:

この問題をバグとしてMicrosoftに提出しました。

4

1 に答える 1

2

これは確かにコンパイラのバグのようです。

ユーザー提供の移動代入演算子を定義したため、コピー代入演算子は暗黙的に削除済みとして定義する必要があります (12.8.18 で指定)。これは、他のコンパイラ (gcc など) が示す動作です。

于 2013-10-09T09:11:14.680 に答える