2011-09-20 17 views
8

Questa potrebbe essere una domanda per principianti e capire come funziona cout è probabilmente la chiave qui. Se qualcuno potesse collegarsi a una buona spiegazione, sarebbe fantastico. cout<<cout e cout<<&cout valori esadecimali separati da 4 su una macchina x86 di Linux.Qual è la differenza tra cout << cout e cout << & cout in C++?

+0

Ecco un esempio per le persone. http://ideone.com/0FZXZ –

+1

In realtà * è * la domanda? – Puppy

+3

Perché stai chiedendo questo. La domanda non ha alcun senso, non è logico farlo. –

risposta

16

cout << cout equivale a cout << cout.operator void *(). Questo è l'idioma utilizzato prima di C++ 11 per determinare se un iostream si trova in uno stato di errore e viene implementato in std::ios_base; di solito restituisce l'indirizzo di static_cast<std::ios_base *>(&cout).

cout << &cout stampa l'indirizzo di cout.

Poiché std::ios_base è una classe base virtuale di cout, potrebbe non essere necessariamente contigua con cout. Ecco perché stampa un indirizzo diverso.

0

cout<<&cout sta passando l'indirizzo di cout allo stream.

4

cout << &cout sta passando cout l'indirizzo di cout.

cout << cout fase di stampa del valore delle implicitamente colata cout a un puntatore void* utilizzando la sua operator void*.

+0

Il collegamento è rotto. – Destructor

+0

Ho rimosso il collegamento poiché non sono riuscito a trovare un sostituto adatto. Grazie – GWW

5

cout << cout utilizza la conversione incorporata in void* che esiste per scopi di test booleani. Per qualche motivo non pertinente la tua implementazione utilizza un indirizzo che è 4 byte nell'oggetto std::cout. In C++ 11 questa conversione è stata rimossa e questo non dovrebbe essere compilato.

cout << &cout sta stampando l'indirizzo dell'oggetto std::cout.

3

Come già detto, cout << cout utilizza la conversione void* previsto per il test bool (while (some_stream){ ... }, ecc)

stampa il valore & cout + 4 perché la conversione è fatta nella implementazione di base, e getta alla propria tipo, questo è from libstdc++:

operator void*() const 
{ return this->fail() ? 0 : const_cast<basic_ios*>(this); } 
Problemi correlati