2012-06-11 12 views
9

Sono curioso di sapere se std :: cout ha un valore di ritorno, perché quando faccio questo:Lo std :: cout ha un valore di ritorno?

cout << cout << ""; 

po 'di codice hexa viene stampato. Qual è il significato di questo valore stampato?

+1

Anche se la domanda in sé non è (abbastanza) un duplicato esatto, la maggior parte delle risposte a una [domanda precedente] (http://stackoverflow.com/q/7489069/179910) si applicano anche qui. –

risposta

18

Poiché gli operandi cout << cout sono tipi definiti dall'utente, l'espressione è effettivamente una chiamata di funzione. Il compilatore deve trovare il miglior operator<< che corrisponda agli operandi, che in questo caso sono entrambi di tipo std::ostream.

Esistono molti overload di operatori candidati tra cui scegliere, ma descriverò solo quello che verrà selezionato, seguendo il solito processo di risoluzione del sovraccarico.

std::ostream ha un operatore di conversione che consente la conversione in void*. Questo è usato per abilitare il test dello stato del flusso come una condizione booleana (cioè, consente a if (cout) di funzionare).

La destra operando expression cout viene convertito implicitamente void const* utilizza questo operatore di conversione, quindi il operator<< overload che accetta un ostream& e void const* è chiamato a scrivere questo valore di puntatore.

Si noti che il valore effettivo risultante dalla conversione da ostream a void* non è specificato. La specifica specifica che se il flusso si trova in uno stato negativo, viene restituito un puntatore nullo, altrimenti viene restituito un puntatore non nullo.


I operator<< overload per inserimento flusso hanno un valore di ritorno: tornano il flusso che è stato fornito come operando. Questo è ciò che consente il concatenamento delle operazioni di inserimento (e per i flussi di input, le operazioni di estrazione usando >>).

14

coutnon ha un valore di ritorno. cout è un oggetto di tipo ostream. operator << ha un valore restituito, restituisce un riferimento a cout.

Vedere http://www.cplusplus.com/reference/iostream/ostream/operator%3C%3C/ come riferimento.

L'unica firma che corrisponde è:

ostream & operatore < < (ostream & (* pf) (ostream &));

quindi restituisce il puntatore al membro operator<<.

quello nella risposta di James. :)

+1

Non riesco a vedere in alcun modo che questo codice valuti semanticamente per "stampare l'indirizzo di una funzione dell'operatore' '". È molto più probabile che sia valutato come '(cout << cout) <<" "' e la chiamata interna sta visualizzando qualunque cosa 'void *' a cui 'cout' viene convertita. – cdhowie

1

Credo che sarebbe l'indirizzo dell'oggetto ostream che "" viene però stampato

+0

@Luchian mi ha battuto con un riferimento –

+1

No, perché restituisce un riferimento non un puntatore. –

Problemi correlati