为什么在C ++中调用此运算符?

时间:2011-03-27 08:02:10

标签: c++ overloading operator-keyword

我不明白,为什么在最后一行调用了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) {}
}

3 个答案:

答案 0 :(得分:6)

编译器搜索(a&amp;&amp; b)的最佳匹配。

因为该类没有将 MyClass 转换为布尔值的运算符,所以它会搜索最佳的强制转换。

运算符aaa()const 是对aaa类型指针的强制转换。指针可以用句子来评估。

Overloading typecasts

Conversion Functions (C++)

答案 1 :(得分:3)

您的变量用于表达式。该类型本身没有操作员&amp;&amp;为它定义,但 可转换为可在表达式中使用的类型(指针)。因此调用转换运算符。

答案 2 :(得分:0)

它看起来像一个类型转换操作符。哎呀,没关系,误读'为什么这个操作符叫''这个操作符叫什么'


好的,我测试了你的代码并进行了更多的检查。因此,运算符aaa是类型转换为aaa类型。类型aaa是指向void func()类型的成员函数的指针。 ThisTypeDoesNotSupportComparisons是aaa类型的函数。调用operator aaa并返回指向函数的指针。

我认为它被调用是因为if允许使用指向函数的指针。您可以测试指针是否为NULL,这是编译器可以找到的最接近的,因此如果调用运算符aaa并测试返回的指针是否为零。