为什么boost :: checked_delete"故意复杂"?

pus*_*its 20 c++ boost

所以我正在查看一些提升源代码,并发现了这个:

(来自<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的结果变为无效?这条线到底是做什么的?

使编译器警告静音.