estoy ansioso por ver si std :: cout tiene un valor de retorno, porque cuando hago esto:¿std :: cout tiene un valor de retorno?
cout << cout << "";
se imprime un código hexadecimal. ¿Cuál es el significado de este valor impreso?
estoy ansioso por ver si std :: cout tiene un valor de retorno, porque cuando hago esto:¿std :: cout tiene un valor de retorno?
cout << cout << "";
se imprime un código hexadecimal. ¿Cuál es el significado de este valor impreso?
Debido a que los operandos de cout << cout
son tipos definidos por el usuario, la expresión es de hecho una llamada a la función. El compilador debe encontrar el mejor operator<<
que coincida con los operandos, que en este caso son ambos del tipo std::ostream
.
Existen muchas sobrecargas de operadores candidatos para elegir, pero describiré la que termina siendo seleccionada, siguiendo el proceso habitual de resolución de sobrecarga.
std::ostream
tiene un operador de conversión que permite la conversión a void*
. Esto se usa para permitir probar el estado de la secuencia como una condición booleana (es decir, permite que if (cout)
funcione). expresión operando
La derecha cout
se convierte implícitamente a void const*
el uso de este operador de conversión, entonces la sobrecarga operator<<
que toma un ostream&
y una void const*
está llamado a escribir este valor del puntero.
Tenga en cuenta que el valor real resultante de la conversión ostream
a void*
no está especificado. La especificación solo exige que si la transmisión está en mal estado, se devuelve un puntero nulo; de lo contrario, se devuelve un puntero no nulo.
Los operator<<
sobrecargas de corriente de inserción tiene un valor de retorno: vuelven la corriente que se proporciona como un operando. Esto es lo que permite el encadenamiento de operaciones de inserción (y para flujos de entrada, operaciones de extracción usando >>
).
cout
no tiene un valor de retorno. cout
es un objeto de tipo ostream
. operator <<
tiene un valor de retorno, devuelve una referencia a cout
.
Consulte http://www.cplusplus.com/reference/iostream/ostream/operator%3C%3C/ para referencia.
La única firma que coincide es:
ostream & operador < < (ostream & (* pf) (ostream &));
por lo que devuelve el puntero al miembro operator<<
.
la respuesta de James. :)
No veo ninguna forma en que este código evalúe semánticamente como "imprimir la dirección de una función' operador << '". Es mucho más probable que se evalúe como '(cout << cout) <<" "' y que la llamada interna muestre el 'void *' en el que se convierte 'cout'. – cdhowie
creo que sería la dirección del objeto ostream que "" se imprimieron a
@Luchian me ganó con una referencia –
No, porque devuelve una referencia, no un puntero. –
Aunque la pregunta en sí misma no es (exactamente) un duplicado exacto, la mayoría de las respuestas a una [pregunta anterior] (http://stackoverflow.com/q/7489069/179910) se aplican aquí también. –