зачем явно удалять конструктор?
когда / почему я хочу явно удалить мой конструктор? Предполагаю, причина в том, чтобы предотвратить его использование, почему бы просто не сделать это private
?
class Foo
{
public:
Foo() = delete;
};
спасибо!
3 ответа:
как насчет:
//deleted constructor class Foo { public: Foo() = delete; public: static void foo(); }; void Foo::foo() { Foo f; //illegal }
и
//private constructor class Foo { private: Foo() {} public: static void foo(); }; void Foo::foo() { Foo f; //legal }
это в основном разные вещи.
private
говорит вам, что только члены класса могут вызвать этот метод или получить доступ к этой переменной (или друзей, конечно). В этом случае это законно дляstatic
метод этого класса (или любого другого члена) называтьprivate
конструктор класса. Это не относится к удаленным конструкторам.пример здесь.
зачем явно удалять конструктор?
еще одна причина:
Я используюdelete
когда я хочу убедиться, что класс вызывается с инициализатором. Я считаю, что это очень элегантный способ достичь этого без проверки времени выполнения.компилятор C++ выполняет эту проверку для вас.
class Foo { public: Foo() = delete; Foo(int bar) : m_bar(bar) {}; private: int m_bar; }
Это - очень упрощенный - код гарантирует, что нет такого экземпляра:
Foo foo;
Я встречался с ctors по умолчанию, объявленными как "удаленные" в исходном коде LLVM (в AlignOf.ч, например). Связанные шаблоны классов обычно находятся в специальном пространстве имен под названием 'llvm::detail'. Вся цель там, я думаю, заключалась в том, что они рассматривали этот класс только как вспомогательный класс. Они никогда не намеревались создавать их; только использовать их в контексте других шаблонов классов с некоторыми трюками метапрограммирования, которые выполняются во время компиляции.
например. есть Шаблон класса AlignmentCalcImpl, который используется только внутри другого шаблона класса называется изменения стандартной библиотеки в качестве параметра значение sizeof(.) оператор. Это выражение может быть оценено во время компиляции; и нет необходимости создавать экземпляр шаблона -> так почему бы не объявить ctor delete по умолчанию, чтобы выразить это намерение.
но это только мое предположение.