我不明白,为什么在最后一行调用了aaa运算符?
#include <iostream>
class MyClass
{
private:
typedef void (MyClass::*aaa)() const;
void ThisTypeDoesNotSupportComparisons() const {}
public:
operator aaa() const { return (true) ? &MyClass::ThisTypeDoesNotSupportComparisons : 0; }
};
int main()
{
MyClass a;
MyClass b;
if(a && b) {}
}
答案 0 :(得分:6)
编译器搜索(a&amp;&amp; b)的最佳匹配。
因为该类没有将 MyClass 转换为布尔值的运算符,所以它会搜索最佳的强制转换。
运算符aaa()const 是对aaa类型指针的强制转换。指针可以用句子来评估。
答案 1 :(得分:3)
您的变量用于表达式。该类型本身没有操作员&amp;&amp;为它定义,但 可转换为可在表达式中使用的类型(指针)。因此调用转换运算符。
答案 2 :(得分:0)
它看起来像一个类型转换操作符。哎呀,没关系,误读'为什么这个操作符叫''这个操作符叫什么'
好的,我测试了你的代码并进行了更多的检查。因此,运算符aaa是类型转换为aaa类型。类型aaa是指向void func()类型的成员函数的指针。 ThisTypeDoesNotSupportComparisons是aaa类型的函数。调用operator aaa并返回指向函数的指针。
我认为它被调用是因为if允许使用指向函数的指针。您可以测试指针是否为NULL,这是编译器可以找到的最接近的,因此如果调用运算符aaa并测试返回的指针是否为零。