我正在关注文件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 ++专家可以分享你的想法吗?
答案 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没有成员指针的特殊输出运算符。