Heim > Backend-Entwicklung > C++ > Kann ich die Adresse einer Standardbibliotheksfunktion wie „std::tolower' übernehmen?

Kann ich die Adresse einer Standardbibliotheksfunktion wie „std::tolower' übernehmen?

Patricia Arquette
Freigeben: 2024-12-17 20:22:13
Original
500 Leute haben es durchsucht

Can I Take the Address of a Standard Library Function Like `std::tolower`?

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";
}
Nach dem Login kopieren

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 ist wörtlich in C enthalten. Das bedeutet, dass das Verhalten von Standard-C-Funktionen wie tolower mit dem C-Standard übereinstimmen muss, der ausdrücklich die Übernahme ihrer Adressen verbietet.

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage