Я читал код 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
?