Подтвердить что ты не робот

Почему явным образом удаляю конструктор?

Когда/почему я хочу явно удалить мой конструктор? Предполагая, что причина заключается в том, чтобы предотвратить его использование, почему бы просто не сделать его private?

class Foo
{ 
  public: 
    Foo() = delete; 
};

Спасибо!

4b9b3361

Ответ 1

Как насчет:

//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 класса. Это не выполняется для удаленных конструкторов.

Пример здесь.

Ответ 2

Я встречался со стандартными ctors, объявленными как "удаленные" в исходном коде LLVM (например, в AlignOf.h). Связанные шаблоны классов обычно находятся в специальном пространстве имен, называемом "llvm:: detail". Вся цель там, я думаю, состояла в том, что они рассматривали этот класс только как вспомогательный класс. Они никогда не собирались создавать их; только для их использования в контексте других шаблонов классов с некоторыми трюками метапрограммирования, которые выполняются во время компиляции.

Eg. есть этот шаблон класса AlignmentCalcImpl, который используется только внутри другого шаблона класса AlignOf в качестве параметра для оператора sizeof (.). Это выражение можно оценить во время компиляции; и нет необходимости создавать экземпляр шаблона → так почему бы не объявить удаление ctor по умолчанию, чтобы выразить это намерение.

Но это только мое предположение.