检查完整类型

时间:2017-11-23 07:15:22

标签: c++ templates boost

我在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 ++中的完整类型是什么?

1 个答案:

答案 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[]