Описание тега deleted-functions

В C++11 появилась возможность помечать функции-члены как удаленные, что означает, что любая попытка вызова этих функций вызывает ошибку компиляции. Это можно использовать для предотвращения неправильного использования класса. Например, если класс предназначен для управления уникальным ресурсом, объект этого класса не должен копироваться. Этого можно достичь, удалив его конструктор копирования и функции присваивания копии.

В C++11 deleteключевое слово может использоваться для явного запрета использования функции-члена: если она будет удалена, любая попытка ее вызова вызовет ошибку компиляции (во время выполнения разницы нет). Это полезно, когда вызов этой функции может привести к неверным результатам и / или неожиданному поведению.

Примером является класс, который должен управлять уникальным ресурсом: объект этого класса не должен быть копируемым. Обычно, чтобы гарантировать, что функция не используется, программист должен просто избегать ее объявления. Но в некоторых случаях этого недостаточно, потому что некоторые функции могут быть автоматически сгенерированы компилятором, даже если программист их не объявил. Эти функции включают конструкторы, конструкторы копирования / перемещения и назначения копирования / перемещения. Отсутствие их определения не гарантирует, что они не могут быть использованы. Решение - использовать= delete; синтаксис.

Например, следующий класс объявляет конструктор и деструктор, но удаляет конструктор копирования и присваивание копии:

class Unique_manager {
    Unique_manager();                                          // Constructor
    ~Unique_manager();                                         // Destructor
    Unique_manager(const Unique_manager&)            = delete; // Forbid copy constructor
    Unique_manager& operator=(const Unique_manager&) = delete; // Forbid copy assignment
};

В этом случае можно было бы создать объект этого класса:

Unique_manager db_access_manager;

но попытка создать копию из него будет заблокирована компилятором:

Unique_manager another_db_manager(db_access_manager);  // Error: copy constructor
Unique_manager one_more_access_manager;                // OK:    constructor
one_more_access_manager = db_access_manager;           // Error: copy assignment