Почему назначение копии не удаляется при объявлении назначения перемещения?

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.

7

Решение

Это похоже на ошибку компилятора.

Поскольку вы определили предоставленный пользователем оператор присваивания перемещения, оператор присваивания копии должен быть неявно определен как удаленный (как указано в 12.8.18). Это поведение, демонстрируемое другими компиляторами (например, gcc).

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]