Каковы некоторые применения for = delete?

Ранее сегодня я спросил вопрос, который привел к другому: когда следует использовать =delete? Я не думаю, что есть статья, посвященная исключительно =delete на SO, поэтому я просмотрел ее в книге под названием "Язык программирования С++". Я приведу свои выводы в свой ответ ниже.

Прокомментируйте или ответьте, если еще есть, чтобы сказать или я ошибаюсь.

Ответы

Ответ 1

Оказывается, что =delete чрезвычайно полезна! Вот несколько примеров:


В принципе, мы можем предотвратить копирование базовых классов, потому что это часто может привести к разрезанию:

struct Base {

    Base(){}

    Base& operator=(const Base&) = delete; // disallow copying
    Base(const Base&) = delete;

    Base& operator=(Base && ) = delete;      // disallow moving
    Base(Base && ) = delete;

};

struct Der : public Base {};

void func() {

    Der d;
    Base base = d; // this won't work because the copy constructor is deleted!
                   // this behavior is desired - otherwise slicing would occur

}

Это также полезно, когда функция шаблона не может работать с определенным типом:

template<class T>
void fn(T p) { /* ... */ }; // do something with T

void fn(int) = delete; // disallow use with int

void fun() {

    fn(4);      // aha! cannot use fn() with int!
    fn(-4.5);   // fine
    fn("hello");// fine
}

=delete также может запрещать нежелательные преобразования:

struct Z {

    Z(double); // can initialize with a double
    Z(int) = delete; // but not with an integer

};

void f() {

    Z z1 { 1 }; // error! can't use int
    Z z2 { 1.0 }; // double is ok

}

Некоторые более продвинутые использования =delete включают запрещение стека или бесплатное размещение хранилища:

class FS_Only {
    ~FS_Only() = delete;  // disallow stack allocation
};

class Stack_Only {
    void* operator new(size_t) = delete;   // disallow heap allocation
};

... У вас есть идея. Надеюсь, это поможет кому-то! =delete может помочь написать читаемый, простой и элегантный код.


Edit:

Как было правильно указано в комментариях, теперь невозможно удалить объекты FS_Only, поэтому это не очень полезно использовать =delete в конце концов.