在使用 C 時,您可能想知道是否可以取得駐留在標準函式庫中的函數的位址。這個問題是相關的,因為它會影響這些函數在各種場景中的使用率。
在以下程式碼片段中,對std::invoke 進行了兩次呼叫:
std::invoke(std::boolalpha, std::cout); // #1 std::cout << std::invoke(static_cast<ctype_func>(std::tolower), 'A') << '\n'; // #2
C 語言保證此程式碼的預期輸出20?
否。
當嘗試形成指向標準的指標時,C 程式的行為是明確未定義的函式庫函數,除非該函數已被明確指定為可尋址函數。這是在 C 標準的 [namespace.std] 中規定的。
在第一次呼叫 std::invoke 時,我們嘗試取得指向 std::boolalpha 的指標。幸運的是,[fmtflags.manip] 來拯救我們:
Each function specified in this subclause is a designated addressable function ([namespace.std]).
std::boolalpha 確實是本子條款中指定的函數,使這一行格式良好並相當於:
std::cout.setf(std::ios_base::boolalpha);
不幸的是,對於第二次調用,[cctype.syn]通知我們:
The contents and meaning of the header <cctype> are the same as the C standard library header <ctype.h>.
此標準庫標頭中沒有std:: tolower 明確指定為可尋址函數。因此,該 C 程式的行為是未定義的,可能會導致編譯錯誤。
無法保證此程式碼的預期輸出,而且程式碼甚至可能無法成功編譯與取得 std::tolower 的位址相關的未定義行為。
此外,這不僅適用於標準函式庫函數,也適用於 C 標準中宣告的成員函數 圖書館。取得此類成員函數的位址也會導致未定義的行為。
以上是我可以取得 C 20 中標準函式庫函數的位址嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!