Что это за перечисление в деструкторе?

// 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