Pregunta ¿Qué hace el operador << en el espacio de nombres estándar?


Por supuesto, el siguiente código funciona (llama a std :: cout :: operator <<):

cout << 1 << '1' << "1" << endl;

Sucedió que también hay std :: operator <<, y parece que solo funciona para argumentos char o char *:

operator<<(cout, '1'); // ok
operator<<(cout, "1"); // ok
operator<<(cout, 1);   // error

Entonces, ¿por qué necesitamos este operador y cómo usarlo?

Gracias.


13
2017-10-19 03:52


origen


Respuestas:


operator<<(cout, '1'); // ok
operator<<(cout, "1"); // ok
operator<<(cout, 1);   // error

Las primeras dos obras porque invocan no es miembro funciones teniendo dos argumentos. Las funciones que toma char y char const* como argumento se definen como no es miembro (libre) funciones.

Sin embargo, la función que toma int como argumento se define como miembro función, lo que significa que el tercero necesita invocar una función miembro. Si lo invocas como no es miembro función, entonces int tendría que ser convertido en algún tipo para lo cual existe una función no miembro. Entonces, cuando se considera esta conversión, resulta ambigua porque hay muchas conversiones posibles igualmente buenas.

Como dije, esto debería funcionar:

cout.operator<<(1); //should work

En cuanto a por qué algunas funciones se definen como miembros y otras como no miembros, no sé la respuesta. Requiere mucho estudio de las propuestas y las decisiones que llevaron a este diseño de la biblioteca.


7
2017-10-19 04:20



Siempre entendí la razón de char, unsigned char y char* siendo definido como funciones no miembro fuera de el basic_ostream la clase es así que es más fácil sobrecargarlos.

Ver, todo lo demás operator<< utilizar el char unos como bloques de construcción. Entonces, si quieres crear un ostream especializado a un específico charT tipo de personaje y / o traits tipo de rasgo: solo tienes que especializarte operator<< funciones.

Si hubieran sido funciones miembro, tendrías que haber especializado toda la clase (básicamente recreando todas las funciones de los miembros de la clase).

No estoy seguro de que sea la única razón, pero así es como siempre lo he visto.


0
2017-10-19 07:24