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?
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?
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 ostream
void*
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 >>
).
cout
hat 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. :)
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
Ich glaube, dass die Adresse des ostream Objekt sein würde, dass „“ zu
@Luchian schlug mich dazu mit einer Referenz –
Nein, weil es eine Referenz nicht einen Zeiger zurückgibt. –
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. –