所以我正在查看一些提升源代码,并发现了这个:
(来自<boost/checked_delete.hpp>)
template<class T> inline void checked_delete(T * x)
{
// intentionally complex - simplification causes regressions
typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
(void) sizeof(type_must_be_complete);
delete x;
}
Run Code Online (Sandbox Code Playgroud)
有人碰巧知道为什么以这种方式实施它?sizeof(T)(例如)是不是已经足够了?
In *_*ico 20
有人早先问了同样的问题.这篇由彼得·迪莫夫(其中一位作家boost/checked_delete.hpp)撰写的文章几乎说明了一切:
- 将sizeof应用于不完整类型的结果是什么?
编译时错误,除非编译器选择将0作为非标准扩展名返回.
- 为什么sizeof被叫两次?
第二个sizeof是Metrowerks CodeWarrior错误的解决方法,其中第一个类型从未实例化,除非使用.
- 为什么sizeof的结果变为无效?这条线到底是做什么的?
使编译器警告静音.