Ключевые слова 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;