`noncopyable` с пользовательским деструктором

Мне нужно noncopyable класс, который имеет объявленный деструктор и наивный подход не работает: см. https://ideone.com/mU8aoc. В чем проблема с деструктором, почему перемещение не работает так же, как и без него? И конечно, как это исправить?

Для справки, полный код (такой же, как ideone ссылка выше):

class noncopyable {
public:
    noncopyable(noncopyable &&) noexcept;

    noncopyable &operator=(noncopyable &&) noexcept;

protected:
    noncopyable() = default;

    ~noncopyable() = default;

    noncopyable(const noncopyable &) = delete;

    noncopyable &operator=(const noncopyable &) = delete;
};

class C: noncopyable {
public:
    // compiles if this line is uncommented
    // C(C&& c);

    C() {}

    // also compiles if this is commented
    ~C() {}
};

C a() {
    return {};
}

C b() {
    return a();
}

int main() {
    return 0;
}

1 ответ

Решение

Чтобы ваш код работал, class C должен быть подвижным. Когда у него нет объявленного деструктора, он получает неявный конструктор перемещения, сгенерированный компилятором (и оператор присваивания перемещения). Но когда у него есть объявленный ("пользовательский" на вашем языке) деструктор, конструктор перемещения (и оператор присваивания перемещения) больше не предоставляются неявно. Это для вашей безопасности: предполагается, что если вам нужен явный деструктор, вам также понадобятся явные функции перемещения.

Ссылка: http://en.cppreference.com/w/cpp/language/move_constructor

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