Оказалось, что =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
после всех.
@Rapptz Я видел этот пост, но я думал, что это о том, что '= default' и' = delete' ** do **. Это касается реального использования '= delete'. Легко понять, что '= delete' запрещает использование функции, но почему на Земле вы хотели бы это сделать? Это сообщение отвечает, почему. – Oleksiy
это запах рыбный ... –
«У этого вопроса уже есть ответ здесь ...» - гм, нет, нет. Несмотря на то, что эти вопросы связаны, они не дублируются. – Oleksiy