我一直在阅读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认为QScopedPointer
有operator bool
而不是operator RestrictedBool
。我不明白RestrictedBool
的目的是什么以及它是如何运作的。例如,更简单的实现是:
inline operator bool() const
{
return !isNull();
}
简而言之:这里发生了什么?为什么operator RestrictedBool
无法正确地返回d
的地址?为什么它首先存在而不是operator bool
?
答案 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的进一步阅读: