关于typedef的基本C ++语法,谁能解释一下呢?

时间:2014-02-26 02:02:37

标签: c++ webkit

我已经阅读了wtf中有关safebool的代码,但我无法理解语法。

以下是webkit中wtf的代码:

    // This conversion operator allows implicit conversion to bool but not to other integer types.
    typedef T* (RefPtr::*UnspecifiedBoolType);
    operator UnspecifiedBoolType() const { return m_ptr ? &RefPtr::m_ptr : 0; }

typedef T* (RefPtr::*UnspecifiedBoolType); 这是什么意思? 我们定义一个新类型或其他东西?上面的int括号是什么意思?

1 个答案:

答案 0 :(得分:1)

你没有给我们链接到完整代码,我希望我发现这个特别。好。如果您不知道typedef是什么意思,我认为最简单的描述是在cppreference.com上,让我引用。

  

http://en.cppreference.com/w/cpp/language/typedef

     

typedef声明提供了一种创建可在任何地方使用的别名的方法   (可能是复杂的)类型名称的位置。

这确实是一个非平凡的例子。从现在起 UnspecifiedBoolType 是Type T * RefPtr :: * 的别名,它是“指向成员的指针”。 我将很感激链接到成员指针的良好描述。我很遗憾,但我没有为初学者提供的东西。

类比,但更简单的情况就在这里。 Q 现在是输入 T * my_class :: * 的别名,它是指向Member的指针。 (检查确认正确性)

 template <typename T>
 class my_class {
   typedef T* (my_class::*Q);
   public:
   void check() {
      std::cout << typeid(Q).name() << '\n';
      std::cout << "Q == (T* my_class<T>::*) is " << std::boolalpha 
                << (typeid(Q) == typeid(T* my_class<T>::*)) << '\n';
     }
  };

它打印为:

  my_class<int> my_object;
  my_object.check();
  

M8my_classIiEPi

     

==( T * my_class :: * true

剩下的第二行,你问过它。

operator UnspecifiedBoolType() const { return m_ptr ? &RefPtr::m_ptr : 0; }

据我所知,m_ptr是 T * 类型。 (指向 T objcet。)因此,它是运算符UnspecifiedBoolType()的定义,它是一个转换函数(它将对象转换为另一种类型的对象,这里 RefPtr UnspecifiedBoolType {又名 T * RefPtr :: * }),这里返回指向成员m_ptr的指针,当m_ptr不是空指针或null时如果是的话。

  

如果我不想在没有typedef的情况下定义它...

这是一个转换函数,类似于:

 class my_class {
   bool is_true;
   public:
   operator bool() const { //conversion to bool
     return is_true;
    }
  };

如果(object_of_my_class)为真,则当is_true为真时,;)(在object_of_my_class中),因为如果预期 bool 。在那里,您将转换为 UnspecifiedBoolType 类型{aka T * RefPtr :: * }。还有一个问题。

// This conversion operator allows implicit conversion to bool but not to other integer types.

上述功能虽然仅定义为 bool 转换,但适用于其他一些类型。在基础示例中,它不是。这是因为指向成员的指针有explicit converse 运算符pointer to member conversion)。 “explicit”的好解释就在这里。例如,最后一个代码,如果我们将转换函数编辑为:

 explicit operator bool() const { //conversion to bool only
   return is_true;
  }

现在不允许implicit conversion。例如:

 my_class object;
 bool b(object); //Ok, everything is correctly
 //int i(object); //It's illegal!
 //bool b2 = object; //Still illegal.

首先注释出来的行给我们:

  

错误:无法在初始化

中将'my_class'转换为'int'

其次表现相似。但你仍然可以这样做:

 bool b3 = bool(object); //or even
 int i2 = bool(object);  //or
 int i3 = static_cast<bool>(object);        //but
 //int i4 = reinterpret_cast<bool>(object); //is still unacceptable.
  

错误:从“my_class”类型无效转换为“bool”

原因是施放的时刻。