Heim >Backend-Entwicklung >C++ >Warum funktioniert `std::cout
Seltsamer Fall von f; Warum wird in der Ausgabe immer 1 ausgegeben?
Das Auftreten eines eigenartigen Verhaltens, bei dem der Aufruf einer Funktion ohne Klammern (f;) und das Drucken ihres Ergebnisses mit std::cout durchweg die Zahl 1 ergibt, kann Fragen aufwerfen. Zunächst könnte man erwarten, dass der Code einen Funktionszeiger ausgibt, aber Beobachtungen deuten auf etwas anderes hin.
Wenn wir uns den Code unten ansehen:
<code class="cpp">#include <iostream> using namespace std; void pr() { cout << "sth"; } int main() { pr; cout << pr; // output: 1 cout << *pr; // output: 1 cout << ≺ // output: 1 }
Wir können sehen, dass pr; ruft die Funktion pr() technisch gesehen nicht auf. Stattdessen wird der Funktionszeiger an cout übergeben. Wenn der Funktionszeiger während dieses Vorgangs in einen Bool-Wert konvertiert wird, verhält er sich ähnlich wie ein logischer Ausdruck, bei dem ein Wert ungleich Null als wahr ausgewertet wird. Dies wird beim Drucken in 1 übersetzt.
Darüber hinaus gibt es im Standard vor C 11 keine Überladung, die das Streamen eines Funktionszeigers ermöglicht. Dies macht es schwierig, Funktionszeiger direkt mit std::cout zu formatieren und zu drucken. Mit dem Aufkommen von C 11 kann man jedoch eine benutzerdefinierte Überladung definieren, um dies zu erreichen:
<code class="cpp">template <class RType, class ... ArgTypes> std::ostream & operator<<(std::ostream & s, RType(*func)(ArgTypes...)) { return s << "(func_ptr=" << (void*)func << ")(num_args=" << sizeof...(ArgTypes) << ")"; }
Mit dieser Überladung wird cout << pr gibt nun Folgendes aus:
<code class="text">(func_ptr=<address of pr>)(num_args=0)</code>
Diese benutzerdefinierte Überladung demonstriert das Drucken von Funktionszeigern unterschiedlicher Stelligkeit. Das Problem mit Funktionszeigern wird zwar gemildert, Szenarios mit überladenen Funktionen oder Funktionsvorlagen, bei denen die Angabe der gewünschten Überladung unerlässlich ist, werden jedoch nicht vollständig gelöst.
Das obige ist der detaillierte Inhalt vonWarum funktioniert `std::cout. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!