Когда я запустил следующую программу
#include <iostream>
int main()
{
char c = 'a';
std::cout << c << std::endl;
std::cout.operator<<(c) << std::endl;
return 0;
}
Я получил вывод
a
97
Копаясь далее в http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt, я заметил, что std::ostream::operator<<()
не имеет перегрузки, которая имеет char
в качестве типа аргумента. Вызов функции std::cout.operator<<(a)
разрешается до std::ostream::operator<<(int)
, что объясняет вывод.
Я предполагаю, что функция operator<<
между std::ostream
и char
объявлена в другом месте:
std::ostream& operator<<(std::ostream& out, char c);
В противном случае std::cout << a
разрешит std::ostream::operator<<(int)
.
Мой вопрос: почему объявлено/определено как функция, не являющаяся членом? Существуют ли какие-либо известные проблемы, которые мешают ему быть функцией-членом?