检查是否完成类型

Check for Complete type

本文关键字:类型 是否 检查      更新时间:2023-10-16

我在 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;
}

在此页面上,我获得了有关其目的的信息,

T must be a complete type. The expression delete [] p must be well-formed.

但是,C 中的完整类型是什么?

要回答,需要回答不完整类型的内容。该标准实际上具有定义([basic.types]/5):

一级已声明但未定义,一种枚举类型 某些上下文([dcl.enum])或一系列未知的界限或 不完整的元素类型,是一种不完全定义的对象类型。 不完全定义的对象类型和CV void是不完整的类型 ([基本。物体不得定义为 不完整的类型。

"某些上下文"是指该类型的完整定义时的情况。例如,枚举enum foo : int;的正向声明声明不完整的类型。

现在,由于sizeof可能无法应用于不完整的类型([Expr.SizeOf]/1):

sizeof操作员不得应用于具有的表达式 功能或不完整的类型,以这种类型的括号名称, 或到指定位场的glvalue。

对于第一个引用段落中标准列表的任何类型的typedef都是不正确的。您将收到一个错误消息,其中包括文本type_must_be_complete

,以防万一有一些病理编译器扩展程序允许类型具有0个大小,作者谨慎,并通过给出负大小来确保数组定义仍然不明显。因此,您也不会在那些病理案例中调用delete[]