Какой минимальный класс следует расширить для типа без копирования / без перемещения?
Скажем, я хочу создать несколько классов для управления ресурсами, которые не следует копировать или перемещать, что было бы минимальным классом, который нужно расширять и избегать ошибок?
Идея в том, что, расширяя класс, я на безопасную сторону перехожуправил 0/3/5 .
Я имею в виду, что, видимо, работает.
class NOCOPYNOMOVE {
NOCOPYNOMOVE(NOCOPYNOMOVE &v) = delete;
NOCOPYNOMOVE(NOCOPYNOMOVE &&v) = delete;
NOCOPYNOMOVE& operator=(NOCOPYNOMOVE &r) = delete;
NOCOPYNOMOVE& operator=(NOCOPYNOMOVE &&r) = delete;
};
class Foo: private NOCOPYNOMOVE {
public:
Foo() {}
~Foo() {}
};
1 ответ
- Не нужно удалять конструктор перемещения, см. /questions/26175049/dolzhen-li-ya-udalit-konstruktor-peremescheniya-i-naznachenie-peremescheniya-intellektualnogo-ukazatelya/26175062#26175062
- Избегать
ALL_CAPS
имя, как это принято во всех соглашениях, используемых для макросов - Нет причин пропускать
const
в конструкторе копирования / присваивании, поэтому предпочтительнее использовать обычную форму - Если бы классы унаследовали от некоторых
NOCOPYNOMOVE
в некотором пространстве имен это может вызвать непреднамеренный запуск ADL.boost::noncopyable
решает это, помещая определение вnoncopyable_
пространство имен, см. реализацию - Я бы предпочел просто не иметь какой-то базы, вместо этого прописав эти две или три строки в целевом классе:
class Foo {
public:
Foo() {}
~Foo() {}
Foo(const Foo&) = delete;
Foo& operator=(const Foo&) = delete;
};