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"; }
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'.
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.
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).
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.
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!