Синтаксис C++: модификаторы по умолчанию и удалить
Сегодня я наткнулся на фрагмент кода, как этот:
class A
{
A() = default;
A (const A&) = delete;
...
}
Я никогда не видел ни ключевое слово delete, ни ключевое слово по умолчанию. Являются ли они частью C++11 стандарт? И для чего они используются?
1 ответ
Специальные функции-члены теперь могут быть по умолчанию или удалены.
Удаленная функция-член по-прежнему участвует в разрешении перегрузки, но если она выбрана, программа имеет неверный формат и компиляция останавливается с полезной диагностикой. Это правильный способ писать такие вещи, как не копируемые классы, и пользователь получает правильное сообщение об ошибке.
По умолчанию функция-член "делает то, что должна", например, конструктор по умолчанию default-инициализирует все базы и члены и имеет пустое тело; конструктор копирования по умолчанию копирует каждый объект base и member, а оператор по умолчанию присваивает каждому объекту base и member. Если какая-либо из этих операций не разрешена (например, у вас есть ссылочные члены), то функция-член по умолчанию определяется как удаленная.
Обратите внимание, что ваше первое объявление-определение A() = default;
делает конструктор A::A()
объявленный пользователем, но не определенный пользователем; это важно для классификации A
Например, является ли это POD. (И обратите внимание, что это отличается от struct A { A(); }; A::A() = default;
который определяется пользователем.)
Другим приятным следствием является прояснение неявно сгенерированных вещей: если вы сами не пишете определенные функции (например, конструкторы копирования), вы неявно объявляетесь за вас. Когда неявно объявленный объект используется odr, он неявно определяется как дефолтный, и, таким образом, если это невозможно (например, если в классе есть не копируемые члены), он фактически неявно определяется как удаленный. Так что это, как правило, изящный способ распространения таких вещей, как невозможность копирования и назначения, по крайней мере, с точки зрения языка и последующей диагностики.