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に提出しました。