Почему конструктор перемещения по умолчанию использует конструктор копирования?
При использовании move constr
class A {
private:
unique_ptr<int> ptr;
public:
A(const A&) = delete;
A& operator= (const A&) = delete;
A(A&&)
{
cout << "MOVE CONSTRUCTOR" << endl;
}
A& operator = (A&&) = default;
~A() = default;
A(int i): ptr(make_unique<int>(i)) {}
};
class B {
private:
A a, b;
public:
B(A& put, A& call): a(move(put)), b(move(call)) {}
};
int main() {
A a1(1);
A a2(2);
B b1(a1, a2);
return 0;
}
В конструкторе B я создаю экземпляры переменных-членов B с помощью вызовов конструктора перемещения A. Однако компилятор по умолчанию заменяет мой вызов конструктора перемещения вызовом конструктора копирования и выдает ошибку «пытается сослаться на удаленную функцию». Помимо объявления конструкторов перемещения и копирования, операторов присваивания перемещения и копирования и деструктора для класса A, я попытался явно определить конструктор перемещения, явно определив оператор присваивания перемещения, неявно объявив как конструктор копирования, так и оператор присваивания копии. . Кажется, что код работает в GCC, но не в MSVC, который является компилятором, который я использовал для написания всего своего кода. Используемый язык - C++ 17.