2012-06-11 12 views
9

Ich bin gespannt, ob std :: cout einen Rückgabewert hat, denn wenn ich dies tun:Hat std :: cout einen Rückgabewert?

cout << cout << ""; 

einig Hexa-Code gedruckt wird. Was bedeutet dieser gedruckte Wert?

+1

Obwohl die Frage selbst (nicht) ein exaktes Duplikat ist, gelten die meisten Antworten auf eine [vorherige Frage] (http://stackoverflow.com/q/7489069/179910) auch hier. –

Antwort

18

gedruckt wurde Da die Operanden von cout << cout benutzerdefinierte Typen sind, ist der Ausdruck effektiv ein Funktionsaufruf. Der Compiler muss den besten operator<< finden, der den Operanden entspricht, die in diesem Fall beide vom Typ std::ostream sind.

Es gibt viele mögliche Operator-Überladungen, aus denen Sie wählen können, aber ich werde nur dasjenige beschreiben, das nach der üblichen Überladungsauflösung ausgewählt wird.

std::ostream verfügt über einen Konvertierungsoperator, der die Konvertierung in void* ermöglicht. Dies wird verwendet, um das Testen des Zustands des Stroms als eine boolesche Bedingung zu ermöglichen (d. H. Es erlaubt if (cout) zu arbeiten).

Die rechte Operand Ausdruck cout wird implizit void const* konvertiert diesen Umwandlungsoperator verwendet wird, dann ist die Überlastung, die aufgerufen operator<< ein ostream& und ein void const* wird nimmt diesen Zeigerwert zu schreiben.

beachte, dass der Ist-Wert aus der zu ostreamvoid* Umwandlung resultiert, ist nicht näher bezeichnet. Die Spezifikation schreibt nur vor, dass, wenn der Stream in einem schlechten Zustand ist, ein Null-Zeiger zurückgegeben wird, andernfalls wird ein Nicht-Null-Zeiger zurückgegeben.


Die operator<< Überlastungen für Stream Einsetzen tun einen Rückgabewert: sie zurück um den Strom, der als Operanden zur Verfügung gestellt wurde. Dies ermöglicht die Verkettung von Einfügeoperationen (und für Eingabeströme, Extraktionsoperationen unter Verwendung von >>).

14

couthat keinen Rückgabewert. cout ist ein Objekt vom Typ ostream. operator << hat einen Rückgabewert, es gibt einen Verweis auf cout zurück.

Siehe http://www.cplusplus.com/reference/iostream/ostream/operator%3C%3C/ als Referenz.

Die einzige Signatur, die Spiele ist:

Ostream & Operator < < (Ostream & (* pf) (Ostream &));

so gibt es den Zeiger auf das operator<< Mitglied zurück.

der in James 'Antwort. :)

+1

Ich kann keinen Weg sehen, dass dieser Code semantisch auswertet, um "die Adresse einer' Operator << 'Funktion zu drucken." Es ist viel wahrscheinlicher, dass es als '(cout << cout) << "" bewertet wird und der innere Aufruf zeigt an, welches 'void *' in das 'cout' umgewandelt wird. – cdhowie

1

Ich glaube, dass die Adresse des ostream Objekt sein würde, dass „“ zu

+0

@Luchian schlug mich dazu mit einer Referenz –

+1

Nein, weil es eine Referenz nicht einen Zeiger zurückgibt. –