首頁 > 後端開發 > C++ > 我可以取得像'std::tolower”這樣的標準函式庫函數的位址嗎?

我可以取得像'std::tolower”這樣的標準函式庫函數的位址嗎?

Patricia Arquette
發布: 2024-12-17 20:22:13
原創
490 人瀏覽過

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

我可以取得標準庫中定義的函數的位址嗎?

標準 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 標準庫頭檔 逐字包含在 C 中。這意味著像 tolower 這樣的標準 C 函數的行為必須與 C 標準一致,該標準明確禁止取得它們的位址。

結論

總而言之,即使std::tolower 的行為與C 程式碼片段中具有可尋址屬性的標準函式庫函數類似,其作為C 函數的底層實現使其地址具有未定義的行為。此行為並非特定於 std::tolower,而是適用於未明確指定為可尋址的任何標準函式庫函數。

以上是我可以取得像'std::tolower”這樣的標準函式庫函數的位址嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板