Heim > Backend-Entwicklung > C++ > Können Sie die Adresse der Standardbibliotheksfunktionen in C 20 ermitteln?

Können Sie die Adresse der Standardbibliotheksfunktionen in C 20 ermitteln?

Patricia Arquette
Freigeben: 2024-12-27 02:54:18
Original
534 Leute haben es durchsucht

Can You Take the Address of Standard Library Functions in C  20?

Können Adressen von Standardbibliotheksfunktionen übernommen werden?

Hintergrund

Beachten 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

In diesem Code gibt es zwei Aufrufe von std::invoke. Zeile Nr. 1 übernimmt die Adresse von std::boolalpha, während Zeile Nr. 2 versucht, dasselbe mit std::tolower zu tun. Die erwartete Ausgabe ist 'a'.

Adressierbare Funktionen

Es stellt sich die Frage: Ist die erwartete Ausgabe in C 20 garantiert? Um dies zu beantworten, müssen wir uns mit dem Konzept adressierbarer Funktionen befassen.

Laut [namespace.std] ist der Versuch, einen Zeiger auf eine Standardbibliotheksfunktion oder deren Referenz abzurufen, ein undefiniertes Verhalten, sofern nicht ausdrücklich als adressierbar gekennzeichnet (möglicherweise schlecht geformt). Dieses Verbot erstreckt sich auf die Bildung eines Zeigers auf ein Mitglied für nicht statische Mitgliedsfunktionen der Standardbibliothek.

Analyse

Zeile Nr. 1:

std ::boolalpha wird von [fmtflags.manip] als adressierbare Funktion bezeichnet. Dies bedeutet, dass die Adresse wohlgeformt ist und std::cout.setf(std::ios_base::boolalpha) entspricht.

Zeile #2:

Leider ist std::tolower in [cctype.syn] nicht explizit als adressierbar gekennzeichnet. Daher weist der Versuch von Zeile Nr. 2, ihre Adresse zu übernehmen, ein undefiniertes Verhalten auf (möglicherweise fehlerhaft).

Schlussfolgerung

Die erwartete Ausgabe ist nicht garantiert. Tatsächlich kann aufgrund des undefinierten Verhaltens in Zeile 2 nicht einmal garantiert werden, dass der Code kompiliert wird.

Adressierbare Mitgliedsfunktionen

Dieses Problem betrifft auch Mitgliedsfunktionen. Wie [namespace.std] angibt, ist das Verhalten undefiniert, wenn ein Zeiger auf eine Standardbibliotheksmitgliedsfunktion verwendet wird.

Das obige ist der detaillierte Inhalt vonKönnen Sie die Adresse der Standardbibliotheksfunktionen in C 20 ermitteln?. 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