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 durchgängig 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.
Einblick in den folgenden Code:
#include
using namespace std;
void pr()
{
cout 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:
template
std::ostream & operatorMit dieser Überladung druckt cout
(func_ptr=)(num_args=0)
Dieser Brauch Überladung demonstriert das Drucken von Funktionszeigern unterschiedlicher Arität. Das Problem mit Funktionszeigern wird zwar gemindert, es werden jedoch Szenarien mit überladenen Funktionen oder Funktionsvorlagen, bei denen die Angabe der gewünschten Überladung unbedingt erforderlich ist, nicht vollständig gelöst.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3