看到qt 中 QScopedPointerDeleter的代码,发现一端奇怪的代码 :
typedef char IsIncompleteType[ sizeof(T) ? 1 : -1 ];
(void) sizeof(IsIncompleteType);
经过查找,对代码理解做个记录。
template <typename T>
struct QScopedPointerDeleter
{
static inline void cleanup(T *pointer)
{
// Enforce a complete type.
// If you get a compile error here, read the section on forward declared
// classes in the QScopedPointer documentation.
typedef char IsIncompleteType[ sizeof(T) ? 1 : -1 ];//确保T是一个完整的类型。 sizeof的计算时在编译阶段进行的。所以如果有不完整的类型传入,在编译阶段就能报错。
(void) sizeof(IsIncompleteType);//计算IsIncompleteType的大小,确保上面一句代码不会因为后续对IsIncompleteType无依赖而被编译器优化掉而不执行。
delete pointer;
}
};
C/C++_的不完整类型详解(参考了各位大佬整理下来,特此鸣谢)_原石小珂的博客-CSDN博客_不完全类型
template <typename T>
struct Base
{
static inline void fun()
{
typedef char IsIncompleteType[sizeof(T) ? 1 : -1];//:
(void) sizeof(IsIncompleteType);
}
};
struct XX; //只有类的声明,没有类的定义,此处提供了一个不完整的类类型。
int main()
{
Base<XX>::fun(); //编译报错,1、负下标 2、使用了未定义的类型XX。
return 0;
}