我已经阅读了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括号是什么意思?
答案 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”
原因是施放的时刻。