Коли / чому я хочу явно видалити свій конструктор? Якщо припустити, що причина полягає у тому, щоб запобігти його використанню, чому б просто не зробити це 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коли хочу запевнити, що клас викликається за допомогою ініціалізатора. Я вважаю це дуже елегантним способом досягти цього без перевірок виконання.
Компілятор С ++ робить цю перевірку за вас.
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 за замовчуванням delete для вираження цього наміру.
Але це лише моє припущення.
= default, навіть клас не може цим користуватися, і я особисто вважаю за краще бачити Використання видаленої функції. over Функція є приватною. Перший прямо заявляє: "Це не призначено для використання". Якщо що-небудь виходить із цього, клас, який не може його використовувати, насправді має семантичну різницю.