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?