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

При использовании 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.

0 ответов

Другие вопросы по тегам