我可以取得標準庫中定義的函數的位址嗎?
標準 C 函數是強大的工具,但它們與語法的交互像 std::invoke 有時會揭示意想不到的行為。考慮以下程式碼:
#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"; }
第一次使用std::boolalpha 呼叫std::invoke 按預期工作,導致呼叫std::cout.setf(std::ios_base::boolalpha )並設定布林輸出格式。然而,第二次使用 std::tolower 的呼叫引起了關注。
預期輸出有保證嗎?
不幸的是,這段程式碼的預期輸出不保證在 C 20 中保證。根據[namespace.std](https://en.cppreference.com/w/cpp/header/namespace/std),取得標準函式庫函數的位址(除非它被指定為可尋址)是未定義的行為。 std::tolower 函式就屬於這一類。
這是為什麼?
原因在於 C 標準庫頭檔
結論
總而言之,即使std::tolower 的行為與C 程式碼片段中具有可尋址屬性的標準函式庫函數類似,其作為C 函數的底層實現使其地址具有未定義的行為。此行為並非特定於 std::tolower,而是適用於未明確指定為可尋址的任何標準函式庫函數。
以上是我可以取得像'std::tolower”這樣的標準函式庫函數的位址嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!