有人指出我是“安全 bool(boolean) 习语”,并试图解释发生了什么(解释supplied on the site不足以使我理解它的工作原理)之后,我决定尝试将以下代码拆开并整理试图尽可能简化它。该站点提供了以下代码:
class Testable {
bool ok_;
typedef void (Testable::*bool_type)() const;
void this_type_does_not_support_comparisons() const {}
public:
explicit Testable(bool b=true):ok_(b) {}
operator bool_type() const {
return ok_==true ?
&Testable::this_type_does_not_support_comparisons : 0;
}
};
我决定分析'bool_type'的关键基础,因为这似乎是它的重点。给出以下行:
typedef void (Testable::*bool_type)() const;
一个人可以(由于括号而不太容易)推断出它是一种类型为'void Testable::*'的typedef,其中bool_type表示该类型定义。通过进行以下修改和函数调用,可以进一步证明这一点:
class Testable {
bool ok_;
typedef void (Testable::*bool_type)() const;
void this_type_does_not_support_comparisons() const {}
public:
explicit Testable(bool b=true):ok_(b) {}
bool_type Test; //Added this
operator bool_type() const {
return ok_==true ?
&Testable::this_type_does_not_support_comparisons : 0;
}
};
int main()
{
Testable Test;
int A = Test.Test; //Compiler will give a conversion error, telling us what type .Test is in the process
}
它使我们可以看到bool_type是什么类型:
这表明它确实是'void(Testable::*)'的类型。
问题出现在这里:
如果我们修改以下功能:
operator bool_type() const {
return ok_==true ?
&Testable::this_type_does_not_support_comparisons : 0;
}
并将其转换为:
operator void Testable::* () const //Same as bool_type, right?
{
return ok_==true ?
&Testable::this_type_does_not_support_comparisons : 0;
}
它产生以下投诉:
因此,我的问题是:
如果'void(Testable::*)确实是bool_type的typedef,为什么会产生这些抱怨?
和
这里发生了什么?
最佳答案
您的推理在这里出错
operator void Testable::* () const //Same as bool_type, right?
这是不对的。正如编译器在错误消息中告诉我们的那样,bool_type的类型是:
因此,要在运算符中替换它,您将需要
operator (void (Testable::*)() const) () const
如果有可能的话!看看为什么连丑陋的typedef也有所改进?
在C++ 11中,我们还有新的结构
explicit operator bool()
可以使我们免于这种丑陋。