c++ - sencillos - ¿Por qué el operador<< funciona entre std:: ostream y char es una función no miembro?
sobrecarga de operadores python (2)
El conjunto de insertadores para std::basic_ostream incluye especializaciones parciales para insertar char , signed char , unsigned char y such en basic_ostream<char, ...> streams. Tenga en cuenta que estas especializaciones están disponibles solo para basic_ostream<char, ...> de basic_ostream<char, ...> , no para basic_ostream<wchar_t, ...> de basic_ostream<wchar_t, ...> o streams basados en cualquier otro tipo de carácter.
Si mueve estas plantillas independientes a la definición basic_ostream principal, estarán disponibles para todas las formas de especialización de basic_ostream . Aparentemente, los autores de la biblioteca querían evitar que esto sucediera.
Realmente no sé por qué querían introducir estas especializaciones sobre las más genéricas
template<class charT, class traits>
basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&,
char);
inserter, pero aparentemente tenían sus razones (¿optimización?).
La misma situación existe para los insertadores de cadenas C. Además del insertador más genérico
template<class charT, class traits>
basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&,
const char*);
la especificación de la biblioteca también declara más específico
template<class traits>
basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&,
const char*);
y así.
Cuando ejecuté el siguiente programa
#include <iostream>
int main()
{
char c = ''a'';
std::cout << c << std::endl;
std::cout.operator<<(c) << std::endl;
return 0;
}
Tengo la salida
a
97
Profundizando en http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt , noté que std::ostream::operator<<() no tiene una sobrecarga que tenga char como tipo de argumento. La función call std::cout.operator<<(a) se resuelve en std::ostream::operator<<(int) , que explica el resultado.
Supongo que la función del operator<< entre std::ostream y char se declara en otro lugar como:
std::ostream& operator<<(std::ostream& out, char c);
De lo contrario, std::cout << a resolvería a std::ostream::operator<<(int) .
Mi pregunta es por qué se declara / define como una función no miembro? ¿Hay problemas conocidos que impidan que sea una función miembro?