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.
Это похоже на ошибку компилятора.
Поскольку вы определили предоставленный пользователем оператор присваивания перемещения, оператор присваивания копии должен быть неявно определен как удаленный (как указано в 12.8.18). Это поведение, демонстрируемое другими компиляторами (например, gcc).
Других решений пока нет …