Явное удаление функций в C++11

Думаю что все помнят что в C++03 для того, что бы сделать какой-либо класс защищенным от копирования было необходимо объявить его конструктор копирования и защищенными.

class Foo {
public:
    Foo(){}
    ~Foo(){}
private:
    Foo(const Foo&);
    Foo& operator=(const Foo&);
};


И при попытке создать копию объекта компилятор бил по рукам. Не очень наглядное, тем не менее отлично работающее решение. В C++11 наглядность возрасла благодаря ключевому слову delete:

class Foo {
public:
    Foo(){}
    ~Foo(){}
    Foo(const Foo&) = delete;
    Foo& operator=(const Foo&) = delete;
};

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

template<typename T>
T* clone(const T *obj) {
    return new T{*obj};
}

Foo* clone(const Foo *obj) = delete;

Само собой, все работашие для C++03 решения продолжают работать, но наглядность явного удаления той или иной функции в C++11 посредствам delete превосходит ранее использовавшиеся решения.

Leave a Reply