2012-06-11 69 views
9

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?

+1

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. –

Respuesta

18

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 >>).

14

coutno 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. :)

+1

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

1

creo que sería la dirección del objeto ostream que "" se imprimieron a

+0

@Luchian me ganó con una referencia –

+1

No, porque devuelve una referencia, no un puntero. –

Cuestiones relacionadas