首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >操作符RestrictedBool在QScopedPointer中的作用是什么?

操作符RestrictedBool在QScopedPointer中的作用是什么?
EN

Stack Overflow用户
提问于 2016-05-03 19:24:00
回答 1查看 631关注 0票数 12

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

下面是来自QScopedPointer on code.qt.io的相关代码:

代码语言:javascript
复制
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认为QScopedPointer有一个operator bool而不是operator RestrictedBool的预处理器定义。我不明白的是,RestrictedBool的用途是什么以及它是如何做到的。例如,一个更简单的实现是:

代码语言:javascript
复制
inline operator bool() const
{
    return !isNull();
}

简单地说,,这里发生了什么?为什么operator RestrictedBool会暗中返回d的地址,以及为什么它首先存在而不是operator bool

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-03 20:25:19

这是安全Bool成语的一个实现,这里解释道。

天真的实现:

代码语言:javascript
复制
inline operator bool() const
{
    return !isNull();
}

返回可以隐式用于其他操作的bool的r值。

代码语言:javascript
复制
QScopedPointer<Foo> foo(nullptr);
int i = 1;
if (foo < i)
    ...

是有效密码。

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

注意事项: explicit operator bool,它不需要在C++11或更高版本的代码中使用安全的Bool成语。QScopedPointer在C++11中的实现可能如下所示:

代码语言:javascript
复制
explicit operator bool() const
{
    return !isNull();
}

感谢tobi303和Jarod42为这个答案提供了基础。

关于C++11和安全Bool成语:的进一步解读

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37012710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档