мне нужно 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;
}
Чтобы ваш код работал, class C
должен быть подвижным. Когда у него нет объявленного деструктора, он получает неявный конструктор перемещения, сгенерированный компилятором (и оператор присваивания перемещения). Но когда у него есть объявленный («пользовательский» на вашем языке) деструктор, конструктор перемещения (и оператор присваивания перемещения) больше не предоставляются неявно. Это для вашей безопасности: предполагается, что если вам нужен явный деструктор, вам также понадобятся явные функции перемещения.
Ссылка: http://en.cppreference.com/w/cpp/language/move_constructor
Других решений пока нет …