你没有给我们完整代码的链接,我希望我找到了这个。行。如果你不知道 typedef 是什么意思,我认为最简单的描述是 cppreference.com,让我引用。
http://en.cppreference.com/w/cpp/language/typedef:
typedef 声明提供了一种创建别名的方法,该别名可以在任何地方使用
(可能是复杂的)类型名称的位置。
确实,这是一个不平凡的例子。从现在开始 UnspecifiedBoolType 是类型 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
Q == (T* my_class::*) 是true
剩下的第二行,你问的。
operator UnspecifiedBoolType() const { return m_ptr ? &RefPtr::m_ptr : 0; }
据我所知,m_ptr 是一个 T* 类型。 (指向 T 对象的指针。)所以,它是 operator UnspecifiedBoolType() 的定义,它是一个转换函数(它将对象转换为另一种类型的对象,这里是 >RefPtr 到 UnspecifiedBoolType {aka T* RefPtr::*}),这里返回的是指向成员 m_ptr 的指针,当 m_ptr 不是空指针或空时如果是的话。
如果我不想在没有 typedef 的情况下定义它...
是一个转换函数,类似这样:
class my_class {
bool is_true;
public:
operator bool() const { //conversion to bool
return is_true;
}
};
if(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 operator (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”
Second 的行为类似。但是你仍然可以这样做:
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”类型的无效转换
原因是施放的时刻。