0

我正在关注该文件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++ 大师可以分享你的想法吗?

4

3 回答 3

3

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

问题是,如果您将转换运算符写入bool

operator bool() const;

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

因此,诀窍是使用一种可以转换的类型,bool但所有其他操作都会在编译期间引发错误。推荐的方法是在类中使用指向成员的指针,并且它被typedef编成一个明确的名称,这样错误消息就更容易理解了。


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

explicit operator bool() const { return px; }

更令人愉快,不是吗?

于 2012-06-07T08:33:22.813 回答
1

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

于 2012-06-07T09:47:44.557 回答
1

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

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

见 4.12:

算术、无范围枚举、指针或指向成员类型的指针的纯右值可以转换为 bool 类型的纯右值。

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

于 2012-06-07T08:33:21.623 回答