QScopedPointerDeleter (void) sizeof(IsIncompleteType);

69 篇文章 12 订阅

看到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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值