Ответ 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
в конце концов.