析构函数中的这个枚举是什么?

mar*_*ess 14 c++

// 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_;
    }
Run Code Online (Sandbox Code Playgroud)

注意:C是模板参数

我知道我们无法删除空指针,将引发异常.所以在这种情况下,枚举定义必须做一些事情来防止这种情况.在生产中,有时我们不想简单地结束程序,因为我们有一个空指针,当指针为空时,我们可能想要查看替代方案.而这个代码几乎用于生产?

多谢你们.

jus*_*tin 17

它实际上是删除的静态断言.实现想要知道它是否在删除变量之前处理其声明可见的类型,而不是前向声明.

当您询问不完整类型的大小时,您的编译器将发出错误:

struct S;
enum { Size = sizeof(S) };
Run Code Online (Sandbox Code Playgroud)

更新

正如您的编译器和Matthieu M.将告诉您的那样 - delete一个不完整的类型是未定义的.

  • @Justin:值得准确的是,尝试"删除"指向不完整类型的指针是**未定义的行为**,这就是为什么值得诊断的原因.Boost也有`checked_delete`同样的效果,他们可以重复使用它,但它可能很简单,他们认为它不能保证特定的包含. (5认同)
  • @sharptooth:我认为`C`更清晰,输入也更快:) (2认同)