请问这段Boost中的代码什么意思?

时间:2008-06-20 13:46:29   来源:论坛整理  作者:  编辑:chinaitzhe
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;
}

作者说要有意地搞复杂,简化引起倒退

请问是什么意思?
网友回复:checked_delete代码中用了这么一个技巧。我们知道,对于不完整类型的指针: …… class incomplete; incomplete* p; delete p; …… 在这里,p并未指向一个实例且未指向0,因此delete p是危险的,但根据编译器不同,这里可能只会给出一个warning而不是error。因此,cheched_delete代码中利用了“typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];”,当p未指向实例时,sizeof(T)给出的是0,根据代码,-1是不能作为数组的size的,因此,这里相当于强制编译器给出error而不是 warning。

转载的
网友回复:
引用 1 楼 xkyx_cn 的回复:
checked_delete代码中用了这么一个技巧。我们知道,对于不完整类型的指针: …… class incomplete; incomplete* p; delete p; …… 在这里,p并未指向一个实例且未指向0,因此delete p是危险的,但根据编译器不同,这里可能只会给出一个warning而不是error。因此,cheched_delete代码中利用了“typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];”,当p未指向实例时,sizeof(T)给出的是0,根据代码,-1是不能作为数组的…

boost真的博大精深啊
网友回复:
引用 2 楼 richbirdandy 的回复:
boost真的博大精深啊


要不然敢叫boost这个名啊?
网友回复:请问什么是不完整类型指针,如何重现sizeof(T)==0的结果??
网友回复:我试过sizeof的结果总是大于1,请问如何重现sizeof为0的情况
网友回复:最简单的测试:
C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/





// 此处T是不完整类型 , 编译会出错

typedef char T[];

typedef char type_must_be_complete[ sizeof(T)? 1: -1 ]; 

(void) sizeof(type_must_be_complete);



// 此处T是完整类型 , 编译不会出错

typedef char T[1];

typedef char type_must_be_complete[ sizeof(T)? 1: -1 ]; 

(void) sizeof(type_must_be_complete);




网友回复:有些编译器对于sizeof(T) 当T为不完整类型时,会直接报错:
error C2070: illegal sizeof operand

引用 5 楼 wfh_178 的回复:
我试过sizeof的结果总是大于1,请问如何重现sizeof为0的情况

网友回复:谢谢,是不能编译,第一种情况,T不是类型,报错为 error C2070: 'T': illegal sizeof operand

但是sizeof也不会得到为0的结果啊
网友回复:査了下标准,不答应sizeof 用于非完整类型,应该通常的结果是报error,也许有某些不合标准的编译器设计为0值。

谢谢翱翔的鱼的解答!
关键字:请问,这段,Boost,代码,意思,
上一篇:看过

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面