оператор перегрузки + дважды (внутри и снаружи класса) - PullRequest
2 голосов
/ 13 апреля 2020

Почему мне разрешено делать это, почему нет претензий на неоднозначность, и почему метод класса выбран ранее, чем другой?

class EX
{
public:
    //...

    void operator+(const EX& ref)
    {
        cout << "A";
    }
};

void operator+(const EX& ref1, const EX& ref2)
{
    cout << "B" << endl;
}

int main()
{
    EX obj1{20};
    EX obj2{30};


    cout << "obj1 + obj2 = " <<  obj1 + obj2 << endl;

    return 0;
}

Я ожидал, что глобальная функция operator+ на экране будет напечатано "B", вместо этого напечатано "A".

1 Ответ

6 голосов
/ 13 апреля 2020

Ваша перегрузка члена принимает только неконстантные экземпляры EX для первого операнда, в то время как свободная перегрузка принимает как константные, так и неконстантные экземпляры. По правилам разрешения перегрузки неконстантный выигрывает, потому что он точно соответствует типу, который передается.

Вы получите ошибку неоднозначности, если сделаете перегрузку члена const, указывая, что *this является const:

void operator+(const EX& ref) const
{
    cout << "A";
}
...