我在boost/checked_delete.hpp
有人可以解释第1行和第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;
}
从这个page,我得到了关于他们目的的信息,
T must be a complete type. The expression delete [] p must be well-formed.
但是,C ++中的完整类型是什么?
答案 0 :(得分:2)
要回答这个问题,我们需要回答什么是不完整的类型。该标准实际上有一个定义([basic.types]/5):
已声明但未定义的类,其中包含枚举类型 某些上下文([dcl.enum]),或者一个未知界限或数组 不完整的元素类型,是一个未完全定义的对象类型。 不完全定义的对象类型和cv void是不完整的类型 ([basic.fundamental])。对象不应被定义为具有 不完整的类型。
“某些上下文”是指尚未对该类型进行完整定义的情况。例如,枚举enum foo : int;
的前向声明声明了一个不完整的类型。
现在,由于sizeof
可能不适用于不完整类型([expr.sizeof]/1):
sizeof运算符不应用于具有的表达式 函数或不完整类型,这些类型的括号名称, 或者指定位域的glvalue。
对于第一个引用段落中标准列表的任何类型,typedef
格式不正确。并且您将收到包含文本type_must_be_complete
。
如果有一些pathological compiler extension that allows a type to have 0 size,作者是谨慎的,并确保数组定义仍然是不正确的,给它一个负的大小。因此,您也不会在那些病态案件中致电delete[]
。