检查是否完成类型
Check for Complete type
我在 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[]
。
相关文章:
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 检查函数返回类型是否与STL容器类型值相同
- 检查某些类型是否是模板类 std::optional 的实例化
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- 如何检查模板类型是否可以从给定类型构造
- 用于检测函数类型是否为否的特征
- 了解类型是否可调用
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 键入特征以检查类型是否可从流和 MSVC 读取
- 从双精度转换为整数的显式类型是否始终检查整数溢出?
- 如何获取类型是否真正可移动可构造
- 在编译时检查类型是否为 std::basic_string<T> C++
- 在C++中,转换为simd类型是否有未定义的行为
- POD类型是否完全等同于琐碎的标准布局类型
- 聚合类型是否意味着它也是标准布局
- 有没有一种方法可以使用SFINAE来检测一个类型是否实现了给定的抽象基类
- 验证(使用 static_assert)元组类型是否遵循某种顺序(有状态编译时检查)
- 强制转换为不相关的引用类型是否违反严格的别名规则?
- 特征:从数组类型中获取标量类型是否记录?