Когда / зачем мне явно удалять конструктор? Если предположить, что причина в том, чтобы предотвратить его использование, почему бы просто не сделать это private?
class Foo
{
public:
Foo() = delete;
};
Когда / зачем мне явно удалять конструктор? Если предположить, что причина в том, чтобы предотвратить его использование, почему бы просто не сделать это private?
class Foo
{
public:
Foo() = delete;
};
delete. И вопрос, и ответ Лучиана легко квалифицировать как конструктивные. Любой, кто не вдыхает тонкости C ++ 11, но скоро должен будет получить кое-что из обоих.
Ответы:
Как насчет:
//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;
Fooбыло несколько конструкторов, а не конструкторов по умолчанию, Foo foo;это вызвало бы гораздо более длинную ошибку, в которой перечислялись бы все неявно определенные, защищенные и частные конструкторы, которым не удалось сопоставить.
Я встречал ctors по умолчанию, объявленные как «удаленные» в исходном коде LLVM (например, в AlignOf.h). Связанные шаблоны классов обычно находятся в специальном пространстве имен, называемом 'llvm :: detail'. Я думаю, вся цель заключалась в том, что они рассматривали этот класс только как вспомогательный. Они никогда не собирались создавать их экземпляры; только для использования их в контексте других шаблонов классов с некоторыми уловками метапрограммирования, которые выполняются во время компиляции.
Например. есть этот шаблон класса AlignmentCalcImpl, который используется только в другом шаблоне класса с именем AlignOf в качестве параметра для оператора sizeof (.). Это выражение можно вычислить во время компиляции; и нет необходимости создавать экземпляр шаблона -> так почему бы не объявить удаление ctor по умолчанию, чтобы выразить это намерение.
Но это только мое предположение.
= default, даже класс не может его использовать, и я лично предпочитаю видеть использование удаленной функции. над Функция является частной. В первом прямо говорится: «Это не предназначено для использования». Если из этого что-то выходит, класс, неспособный использовать это, фактически имеет семантическую разницу.