我一直在阅读QScopedPointer的代码,并发现了一些我无法理解的东西。
下面是来自QScopedPointer on 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
发布于 2016-05-03 20:25:19
这是安全Bool成语的一个实现,这里解释道。
天真的实现:
inline operator bool() const
{
return !isNull();
}返回可以隐式用于其他操作的bool的r值。
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中的实现可能如下所示:
explicit operator bool() const
{
return !isNull();
}感谢tobi303和Jarod42为这个答案提供了基础。
关于C++11和安全Bool成语:的进一步解读
https://stackoverflow.com/questions/37012710
复制相似问题