C ++: перегрузка операторов: в классе и вне класса. Неоднозначность с оператором преинкремента

Проверьте это этот код:

struct A
{
A operator+(A const& a) { cout << 1 << endl; return A(); }
A& operator++() { cout << 2 << endl; return *this; }
A operator++(int) { cout << 3 << endl; return *this; }
bool operator!() { cout << 4 << endl; return true; }

};

A operator+(A const& a, A const& b)
{ cout << 5 << endl; return A(); }

A& operator++(A& a) { cout << 6 << endl; return a; }
A operator++(A const& a, int) { cout << 7 << endl; return A(); }
bool operator!(A const& a) { cout << 8 << endl; return false; }

int main()
{
A a, b;

a + b; // Prints 1 instead 5
++a;   // Ambiguity
a++;   // Prints 3 instead 7
!a;    // Prints 4 instead 8

return 0;
}

В каждом случае перегрузка оператора в классе выбирается в сравнении с любой другой перегрузкой вне класса того же оператора, но оператор прединкремента отличается: он вызывает неоднозначность между перегрузкой в ​​классе и переклассом.

Зачем?

2

Решение

Ваш пост-инкрементный оператор не является const член, тогда как не член const A& параметр. Здесь нет двусмысленности, и выбрана неконстантная версия. То же самое не относится к предварительной версии. И член, и не член связываются с неконстантным Aотсюда и двусмысленность.

Посмотрите:

// non-const member. Does not require A operand to be const
A operator++(int)

// non-member. Requires A operand to be const
A operator++(A const& a, int)
4

Другие решения


По вопросам рекламы [email protected]