Публичный удаленный или частный по умолчанию ctor/assignment/copy ctor?
Если я хочу запретить копирование конструкции / назначения, то это:
class foo
{
public:
foo(const foo&) = delete;
foo& operator = (const foo&) = delete;
};
Такой же как:
class foo
{
private:
foo(const foo&) = default;
foo& operator = (const foo&) = default;
};
Какой путь правильный и почему?
1 ответ
Решение
Правильный путь - это первое решение: конструктор копирования и операторы присваивания не определены, поэтому любая попытка их использования не будет компилироваться.
class foo
{
public:
foo(const foo&) = delete;
foo& operator = (const foo&) = delete;
};
Вторым является объявление и определение неявно сгенерированных форм как private
:
- Объект типа
foo
разрешено копировать самому - Любой класс или метод друга также может копировать
foo
Таким образом, копирование конструкции / назначения все еще возможно
Вы также можете использовать boost::noncopyable
как базовый класс, он делает именно это с C++11 (см. исходный код здесь)