Какой минимальный класс следует расширить для типа без копирования / без перемещения?

Скажем, я хочу создать несколько классов для управления ресурсами, которые не следует копировать или перемещать, что было бы минимальным классом, который нужно расширять и избегать ошибок?

Идея в том, что, расширяя класс, я на безопасную сторону перехожуправил 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;
};
Другие вопросы по тегам