C++ 检查完整类型

C++ 检查完整类型,c++,templates,boost,C++,Templates,Boost,我在boost/checked\u delete.hpp 有人能解释一下第1行和第2行在做什么吗 但是,C++中的完全类型是什么? 回答,需要回答什么是不完整类型。该标准实际上有一个定义(): 已声明但未定义的类,是中的枚举类型 某些上下文([dcl.enum]),或未知绑定或 不完整的元素类型,是定义不完整的对象类型。 定义不完整的对象类型和cv void是不完整的类型 ([基础.基本])。不得将对象定义为具有 不完整类型 “特定上下文”指的是尚未对类型进行完整定义的情况。例如,enumenu

我在
boost/checked\u delete.hpp

有人能解释一下第1行和第2行在做什么吗


<>但是,C++中的完全类型是什么?

回答,需要回答什么是不完整类型。该标准实际上有一个定义():

已声明但未定义的类,是中的枚举类型 某些上下文([dcl.enum]),或未知绑定或 不完整的元素类型,是定义不完整的对象类型。 定义不完整的对象类型和cv void是不完整的类型 ([基础.基本])。不得将对象定义为具有 不完整类型

“特定上下文”指的是尚未对类型进行完整定义的情况。例如,enum
enum foo:int的前向声明声明了一个不完整的类型

现在,由于
sizeof
不能应用于不完整的类型():

sizeof运算符不应应用于具有 函数或不完整类型,以括号中的类型名称, 或指定位字段的值

对于第一段引用的标准中列出的任何类型,
typedef
的格式都不正确。您将收到一条错误消息,其中包含文本
type\u must\u complete


为了以防万一,作者非常谨慎,通过给数组定义一个负的大小来确保数组定义仍然是格式错误的。因此,在那些病理性病例中,您也不会调用
delete[]

酷。但是没有if-else子句或return语句,那么我们如何避免函数末尾的
delete[]
?@SauravSahu-因为不完整的类型会导致上述格式错误,所以代码无法编译。它不会在运行时自动泄漏内存。
#2
不是针对未使用的本地类型的自动警告。
template<class T> inline void checked_array_delete(T * x)
{
    typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];     #1 
    (void) sizeof(type_must_be_complete);                       #2
    delete [] x;
}
T must be a complete type. The expression delete [] p must be well-formed.