LINUX.ORG.RU

c++: почему не вызывается конструктор перемещения?

 


0

3

Пусть будет код:


struct A {
    int p = 0;

    A(int v) : p(v) { qDebug() << "constructor by value" << p; }
    A() : p(1) { qDebug() << "constructor empty" << p; }
    ~A() { qDebug() << "destructor" << p; }

    A(A&& o) {
        qDebug() << "constructor move" << p << o.p;
        p = 2;
        o.p = 0;
    }

    void operator=(A&& o) {
        qDebug() << "operator move";
        p = 3;
        o.p = 0;
    }
};

A make1() {
    A a(10);
    return a;
}

...

    qDebug() << "begin";
    A a = make1();
    qDebug() << "end";

Так этот код не вызывает конструктор перемещения или оператор перемещения, его вывод:

begin
constructor by value 10
end
destructor 10

При этом, если я напишу:

struct A {
   A(A&&) = delete;
};

то он будет ругаться, что такой конструктор удален. Конструктор копирования или оператор копирования при таком использовании так же игнорируются.

Получается, при удалении ругается, но при наличии его не использует. Как заставить его вызывать этот конструктор, что это такое и где про это прочитать?

В поисковике выдает выдает кучу примеров про этот конструктор, расписывая что в нем можно расположить какой-то код, но нигде не пишут что это код не вызывается.

Компилирую на GCC 9, на 8 вроде было так же.



Последнее исправление: victor79 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.