C++ 这个typedef是如何工作的?

C++ 这个typedef是如何工作的?,c++,C++,我正在看cpp闪电演讲 这里显示了0:37的代码片段 template<typename T, typename cleanup = QScopedPointerDeleter<T>> class QScopedPointer{ typedef T *QScopedPointer::*RestrictedBool; // how does this work? //why not QScopedPointer<

我正在看cpp闪电演讲 这里显示了0:37的代码片段

template<typename T, typename cleanup = QScopedPointerDeleter<T>>
class QScopedPointer{

typedef T *QScopedPointer::*RestrictedBool; // how does this work? 
                           //why not QScopedPointer<T> since QScopedPointer is a template?

public:
inline operator RestrictedBool() const 
 {
  return isNull()? Q_NULLPTR : &QScopedPointer::d;
 }

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

protected:
 T *d;
};
当我们移动恒星时,这一点可以稍微弄清楚:

typedef T* QScopedPointer::* RestrictedBool;
//      ^~~~~~~~~~~~~~~~~~~~ ^~~~~~~~~~~~~~
//       the type             the alias
在C++11中,我们将把它写得更清楚

using RestrictedBool = T* QScopedPointer::*;
RestrictedBool
此处声明为
T*QScopedPointer::*
的类型别名。因此,
typedef T*F::bool
失败,因为您无法重新定义
bool
:)该名称非常容易引起误解,因为该类型实际上不是布尔类型

类型
T*QScopedPointer::*
是指向成员的指针。这里的类型接受
QScopedPointer
类中的任何
T*
成员,例如

class QScopedPointer {
    operator RestrictedBool() const {
//           ^~~~~~~~~~~~~~
//            this function returns a `RestrictedBool` = `T* QScopedPointer::*`
        return isNull()? Q_NULLPTR : &QScopedPointer::d;
//                                   ^~~~~~~~~~~~~~~~~~
//                                    and this expression has type `T* QScopedPointer::*`
    }

    T *d;
//  ^~~
//   the `d` member has type `T*` in the `QScopedPointer` class.
};

既然
QScopedPointer
是一个模板,为什么不
QScopedPointer


QScopedPointer
内部,可以使用类名
QScopedPointer
代替
QScopedPointer
。这称为本地声明的名称。有关详细信息,请参见。

Pro提示:查看使用该类型存储的值:
&QScopedPointer::d
是指向成员指针的指针。还要注意,
typedef
的语法是
typedef
。注意
RestrictedBool
是新名称,不能在typedef中使用
bool
作为新名称。您也不需要在自己的类定义中使用类模板参数。
using RestrictedBool = T* QScopedPointer::*;
class QScopedPointer {
    operator RestrictedBool() const {
//           ^~~~~~~~~~~~~~
//            this function returns a `RestrictedBool` = `T* QScopedPointer::*`
        return isNull()? Q_NULLPTR : &QScopedPointer::d;
//                                   ^~~~~~~~~~~~~~~~~~
//                                    and this expression has type `T* QScopedPointer::*`
    }

    T *d;
//  ^~~
//   the `d` member has type `T*` in the `QScopedPointer` class.
};