Skip to the content.

Ключевые слова default и delete (C++11)

Вспомним, что у класса есть методы, которые компилятор умеет генерировать самостоятельно:

Если, например, определить конструктор с параметрами, то компилятор уже не будет генерировать конструктор по умолчанию, однако может быть ситуация когда конструктор по умолчанию, который генерирует компилятор нас вполне устраивает и мы хотели бы что бы компилятор нам его сгенерировал. В С++11 появилась возможность явно попросить компилятор нам его сгенерировать:

struct SomeType
{
    SomeType() = default; // просим компилятор о генерации конструктора по умолчанию
    SomeType(int value);  // пользовательский конструктор с параметрами
}

Аналогично ключевое слово default будет работать с остальными методами.

Точно так же появилась возможность попросить компилятор не генерировать какой-то из методов. В старом стандарте нам приходилось хитрить, и объявлять конструктор копирования и оператор присваивания как private чтобы сделать класс, который не копируется, в новом стандарте:

struct NonCopyable
{
    NonCopyable(const NonCopyable &) = delete;
    NonCopyable & operator=(const NonCopyable &) = delete;
}

Более того, можно так же удалять функции:

template<class T>
void foo(T const * p) { ... }

// запретить функции принимать указатель на char:
void foo(char const *) = delete;