Kann ich die Adresse einer in der Standardbibliothek definierten Funktion übernehmen?
Standard-C-Funktionen sind leistungsstarke Werkzeuge, aber ihre Interaktion mit der Syntax wie std::invoke kann manchmal unerwartetes Verhalten offenbaren. Betrachten Sie den folgenden Code:
#include <cctype> #include <functional> #include <iostream> int main() { std::invoke(std::boolalpha, std::cout); // #1 using ctype_func = int(*)(int); char c = std::invoke(static_cast<ctype_func>(std::tolower), 'A'); // #2 std::cout << c << "\n"; }
Der erste Aufruf von std::invoke mit std::boolalpha funktioniert wie erwartet und führt zu einem Aufruf von std::cout.setf(std::ios_base::boolalpha ) und Festlegen des booleschen Ausgabeformats. Der zweite Aufruf mit std::tolower wirft jedoch Bedenken auf.
Ist die erwartete Ausgabe garantiert?
Leider ist die erwartete Ausgabe dieses Codes nicht garantiert in C 20. Laut [namespace.std](https://en.cppreference.com/w/cpp/header/namespace/std), das Annehmen der Adresse einer Standardbibliotheksfunktion (sofern sie nicht als adressierbar gekennzeichnet ist) ist undefiniertes Verhalten. Die Funktion std::tolower fällt in diese Kategorie.
Warum ist das so?
Der Grund liegt in der Tatsache, dass der C-Standardbibliotheksheader
Schlussfolgerung
Abschließend, obwohl std::tolower verhält sich ähnlich wie eine Standardbibliotheksfunktion mit adressierbaren Eigenschaften im C-Code-Snippet. Die zugrunde liegende Implementierung als C-Funktion macht die Übernahme der Adresse zu einem undefinierten Verhalten. Dieses Verhalten ist nicht spezifisch für std::tolower, sondern gilt für alle Standardbibliotheksfunktionen, die nicht explizit als adressierbar gekennzeichnet sind.
Das obige ist der detaillierte Inhalt vonKann ich die Adresse einer Standardbibliotheksfunktion wie „std::tolower' übernehmen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!