определяемый компилятором конструктор перемещения с деструктором

Согласно ссылке cpp cpp-ref, компилятор не генерирует перемещение по умолчанию конструктор, если у нас есть определяемый пользователем деструктор.

Фрагмент кода:

 class General
{
public:
    ~General();
    General();
    void testInitList();
};

int main(int argc, char **argv) {
    General b(std::move(General()));
    General g = std::move(b);
    g.testInitList();
    return 0;
}

Код компилируется, подразумевая, что компилятор создал конструктор перемещения по умолчанию. Код был скомпилирован с использованием gcc версии 5.4.0.

Может ли кто-нибудь объяснить, почему компилятор сгенерировал конструктор перемещения и оператор присваивания перемещения в этом случае, несмотря на наличие деструктора?

Лучший, Рахул


person RGs    schedule 16.06.2019    source источник
comment
Во-первых, он скомпилирован. Во-вторых, у меня были операторы печати в конструкторе и деструкторе. Был напечатан только один оператор конструктора, тогда как были напечатаны несколько операторов деструктора.   -  person RGs    schedule 16.06.2019
comment
Вы не определяете конструктор копирования, поэтому у вас недостаточно распечаток.   -  person S.M.    schedule 16.06.2019
comment
хм. Хорошо, позвольте мне попробовать.   -  person RGs    schedule 16.06.2019
comment
Да, ты прав. Большое спасибо за помощь   -  person RGs    schedule 16.06.2019


Ответы (1)


Когда нет конструктора перемещения или оператора присваивания, перемещение не выполняется. std::move не выполняет перемещение. Он просто приводит свой аргумент, чтобы указать, что перемещение может быть выполнено, если возможно. Если это невозможно, то движения нет, и использование std::move ничего не делает.

person Nikos C.    schedule 16.06.2019
comment
У меня были операторы печати в конструкторе и деструкторе. Был напечатан только один оператор конструктора, тогда как были напечатаны несколько операторов деструктора. Это означает, что объект действительно был перемещен. Выход - создание генерала уничтожение генерала уничтожение генерала уничтожение генерала - person RGs; 16.06.2019
comment
Понял, где ошибся. Большое спасибо Никос. - person RGs; 16.06.2019
comment
@RGs Ваш код вызывает конструктор по умолчанию и неявно определенный конструктор копирования. Так что да, только один будет напечатан. Определите конструктор копирования и напечатайте что-нибудь там. - person Nikos C.; 16.06.2019