Когда/почему я хочу явно удалить мой конструктор? Предполагая, что причина заключается в том, чтобы предотвратить его использование, почему бы просто не сделать его private
?
class Foo
{
public:
Foo() = delete;
};
Спасибо!
Когда/почему я хочу явно удалить мой конструктор? Предполагая, что причина заключается в том, чтобы предотвратить его использование, почему бы просто не сделать его private
?
class Foo
{
public:
Foo() = delete;
};
Спасибо!
Как насчет:
//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
класса. Это не выполняется для удаленных конструкторов.
Пример здесь.
Я встречался со стандартными ctors, объявленными как "удаленные" в исходном коде LLVM (например, в AlignOf.h). Связанные шаблоны классов обычно находятся в специальном пространстве имен, называемом "llvm:: detail". Вся цель там, я думаю, состояла в том, что они рассматривали этот класс только как вспомогательный класс. Они никогда не собирались создавать их; только для их использования в контексте других шаблонов классов с некоторыми трюками метапрограммирования, которые выполняются во время компиляции.
Eg. есть этот шаблон класса AlignmentCalcImpl, который используется только внутри другого шаблона класса AlignOf в качестве параметра для оператора sizeof (.). Это выражение можно оценить во время компиляции; и нет необходимости создавать экземпляр шаблона → так почему бы не объявить удаление ctor по умолчанию, чтобы выразить это намерение.
Но это только мое предположение.