为什么来自boost :: smart_ptr的& this_type :: px返回1?

时间:2012-06-07 08:01:10

标签: c++ boost shared-ptr

我正在关注文件boost/smart_ptr/detail/operator_bool.hpp并遇到以下我不理解的代码片段

typedef T * this_type::*unspecified_bool_type;

operator unspecified_bool_type() const // never throws
{
    return px == 0? 0: &this_type::px;
}

我用XCode写了一些测试代码,&this_type::px总是返回1.为什么?

一些C ++专家可以分享你的想法吗?

3 个答案:

答案 0 :(得分:3)

这是一个名为Safe Bool Idiom的小技巧。

问题在于,如果您将转化运算符编写为bool

operator bool() const;

然后它可以在一些棘手的情况下使用,例如:1 + sharedp bool被提升为int ...愚蠢?

因此,诀窍是使用可以转换为bool的类型,但在编译期间所有其他操作都会引发错误。推荐的方法是在类中使用指向成员的指针,并且typedef为显式名称,以便更容易理解错误消息。


使用C ++ 11,这个技巧已经过时,因为explicit限定符可以应用于转换运算符:

explicit operator bool() const { return px; }

更愉快,不是吗?

答案 1 :(得分:1)

&this_type::px是用于获取等效于true的布尔值的技巧。

由于boost不使用bool类型,而是没有指定它是什么,它使用指向成员的转换,它总是为现有成员返回true的等效表示(即不是nullptr或从0投射的东西)。

见4.12:

  

算术,无范围枚举,指针或指针的prvalue   成员类型可以转换为bool类型的prvalue。

指针到成员的布尔转换总是发生在一个完整的上下文中,因为在C ++中没有从指针到成员的转换为整数。

答案 2 :(得分:1)

它不是1,但如果你没有打开boolalpha标志,它会被ostream输出为1(bool)。 ostream没有成员指针的特殊输出运算符。