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?
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?
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 >>
).
cout
non 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. :)
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
Credo che sarebbe l'indirizzo dell'oggetto ostream che "" viene però stampato
@Luchian mi ha battuto con un riferimento –
No, perché restituisce un riferimento non un puntatore. –
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. –