Почему этот оператор вызывается в C ++? - PullRequest
4 голосов
/ 27 марта 2011

Я не понимаю, почему оператор aaa вызывается во 2-й последней строке?

#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 ]

6 голосов
/ 27 марта 2011

Компилятор ищет лучшее соответствие для (a && b) .

Поскольку в классе нет оператора, который превращает MyClass в логическое значение, он ищет лучший актерский состав.

оператор aaa () const - приведение к указателю типа aaa. Указатели могут быть оценены в предложении if.

Перегрузка типов

Функции преобразования (C ++)

3 голосов
/ 27 марта 2011

Ваши переменные используются в выражении.Для самого типа не определен оператор &&, но он может быть преобразован в тип (указатель), который может использоваться в выражении.Так называется оператор преобразования.

0 голосов
/ 27 марта 2011

Это похоже на оператор приведения типа.Ой, не бери в голову, неправильно прочитал «почему этот оператор называется« для », как этот оператор называется«


»Хорошо, я протестировал ваш код и еще раз проверил его.Таким образом, оператор aaa является приведением типа к типу aaa.Тип aaa является указателем на member функцию типа void func ().ThisTypeDoesNotSupportComparisons является функцией типа aaa.Оператор aaa вызывается и возвращает указатель на функцию.

Я думаю, что он вызывается, потому что if позволяет также использовать указатели на функции.Вы можете проверить, равен ли указатель NULL или нет, и это самое близкое, что может найти компилятор, поэтому, если он вызывает оператор aaa и проверяет, равен ли возвращаемый указатель нулю.

...