sobrecarga sencillos relacionales que operadores matrices esta ejemplos definicion compuesta c++ c++11 ostream

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?


Una razón es seguir el consejo general de C ++ de preferir las funciones de no amigos no miembros a las funciones de miembros. Este es el ítem 23 en Effective C ++ de Scott Meyer. Esto se discute en .