gpt4 book ai didi

c++ - 检查完整类型

转载 作者:搜寻专家 更新时间:2023-10-31 02:08:33 26 4
gpt4 key购买 nike

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

最佳答案

要回答这个问题,需要回答什么是不完整 类型。该标准实际上有一个定义([basic.types]/5):

A class that has been declared but not defined, an enumeration type in certain contexts ([dcl.enum]), or an array of unknown bound or of incomplete element type, is an incompletely-defined object type. Incompletely-defined object types and cv void are incomplete types ([basic.fundamental]). Objects shall not be defined to have an incomplete type.

“某些上下文”指的是还没有类型的完整定义的情况。例如,枚举 enum foo : int; 的前向声明声明了一个不完整的类型。

现在,由于 sizeof 可能不适用于不完整的类型 ([expr.sizeof]/1):

The sizeof operator shall not be applied to an expression that has function or incomplete type, to the parenthesized name of such types, or to a glvalue that designates a bit-field.

对于第一段引用的标准列表中的任何类型,typedef 都是格式错误的。您将收到一条错误消息,其中包含文本 type_must_be_complete

以防万一有一些pathological compiler extension that allows a type to have 0 size , 作者很谨慎,并通过给它一个负大小来确保数组定义仍然是错误的。因此,您也不会在那些病态情况下调用 delete[]

关于c++ - 检查完整类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47449598/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com