Операторы в С++ обычно рассматриваются как альтернативный синтаксис для функций/методов, особенно в контексте перегрузки. Если это так, два приведенных ниже выражения должны быть синонимичными:
std::cout << 42;
operator<<(std::cout, 42);
На практике второе утверждение приводит к следующей ошибке:
call of overloaded ‘operator<<(std::ostream&, int)’ is ambiguous
Как обычно, такое сообщение об ошибке сопровождается списком возможных кандидатов:
operator<<(basic_ostream<_CharT, _Traits>& __out, char __c)
operator<<(basic_ostream<char, _Traits>& __out, char __c)
operator<<(basic_ostream<char, _Traits>& __out, signed char __c)
operator<<(basic_ostream<char, _Traits>& __out, unsigned char __c)
Такая ошибка вызывает как минимум два вопроса:
- Каким образом эти два оператора отличаются (в терминах поиска по имени)?
- Почему
operator<<(basic_ostream<char, _Traits>& __out,
int
__c)
отсутствует?
Кажется, что инфиксные и префиксные нотации не являются полностью взаимозаменяемыми - различный синтаксис влечет за собой другую тактику разрешения имен. Каковы различия и откуда они взялись?