QScopedPointer中运算符RestrictedBool的用途是什么?

时间:2016-05-03 19:24:01

标签: c++ qt qt5

我一直在阅读QScopedPointer的代码,并发现了一些我无法理解的内容。

以下是QScopedPointer在code.qt.io上的相关代码:

template <typename T, typename Cleanup = QScopedPointerDeleter<T> >
class QScopedPointer
{
    typedef T *QScopedPointer:: *RestrictedBool;
public:
...
#if defined(Q_QDOC)
    inline operator bool() const
    {
        return isNull() ? Q_NULLPTR : &QScopedPointer::d;
    }
#else
    inline operator RestrictedBool() const
    {
        return isNull() ? Q_NULLPTR : &QScopedPointer::d;
    }
#endif
...
inline bool isNull() const
{
    return !d;
}
...
protected:
    T *d;

我理解预处理器定义使QDoc认为QScopedPointeroperator bool而不是operator RestrictedBool。我不明白RestrictedBool的目的是什么以及它是如何运作的。例如,更简单的实现是:

inline operator bool() const
{
    return !isNull();
}

简而言之:这里发生了什么?为什么operator RestrictedBool无法正确地返回d的地址?为什么它首先存在而不是operator bool

1 个答案:

答案 0 :(得分:9)

这是 Safe Bool Idiom 的实现,解释c_str

天真的实施:

inline operator bool() const
{
    return !isNull();
}

返回bool的右值,可以隐式用于其他操作,例如

QScopedPointer<Foo> foo(nullptr);
int i = 1;
if (foo < i)
    ...

是有效的代码。

摘要: RestrictedBool是指向typedef类型的指针的私有 d。将它用作运算符的返回类型意味着它可以在if语句(if (foo))中使用,但不能与其他运算符一起使用。

注意: here,这消除了C ++ 11或更高版本代码中对Safe Bool Idiom的需求。 C ++ 11中QScopedPointer的实现可能如下所示:

explicit operator bool() const
{
    return !isNull();
}

感谢tobi303和Jarod42提供此答案的基础。

关于C ++ 11和Safe Bool Idiom的进一步阅读: