Что это за перечисление в деструкторе?
// Destructor. If there is a C object, delete it.
// We don't need to test ptr_ == NULL because C++ does that for us
~scoped_ptr() {
enum { type_must_be_complete = sizeof(C) };
delete ptr_;
}
Примечание: C является параметром шаблона
Я знаю, что мы не можем удалить нулевой указатель, будет создано исключение.
Поэтому в этом случае определение перечисления должно делать что-то, чтобы предотвратить это.
В производстве иногда мы не хотим заканчивать программу просто, потому что у нас есть нулевой указатель, мы можем захотеть взглянуть на альтернативный сценарий, когда указатель имеет значение null.
И этот код используется в производстве почти везде?
Спасибо, ребята.
Ответы
Ответ 1
это эффективно статическое утверждение для удаления. реализация хочет знать, имеет ли он дело с типом, чья декларация видна перед удалением переменной, а не с помощью прямого объявления.
Ваш компилятор выдает ошибку, когда вы задаете ему размер неполного типа:
struct S;
enum { Size = sizeof(S) };
Обновление
Как ваш компилятор и Matthieu M. скажут вам - delete
- неполный тип undefined.
Ответ 2
Усиление check_deleter выглядит лучше:
template<class T> struct checked_deleter
{
typedef void result_type;
typedef T * argument_type;
void operator()(T * p) const;
};
Поскольку какой-то компилятор может вернуть 0, а T не определено, в этом случае
enum { type_must_be_complete = sizeof(T) };
является действительным static assert, но checked_deleter не удался.
http://www.boost.org/doc/libs/1_59_0/libs/core/doc/html/core/checked_delete.html#core.checked_delete.checked_deleter