зачем явно удалять конструктор?


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

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

спасибо!

3 63
c++

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 по умолчанию, чтобы выразить это намерение.

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