ホームページ >バックエンド開発 >C++ >`std::to lower` のような標準ライブラリ関数のアドレスを取得できますか?

`std::to lower` のような標準ライブラリ関数のアドレスを取得できますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-17 20:22:13492ブラウズ

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::to lower を使用した 2 回目の呼び出しでは、懸念が生じます。

期待される出力は保証されていますか?

残念ながら、このコードの期待される出力は保証されていません。 C 20 で保証。 [namespace.std](https://en.cppreference.com/w/cpp/header/namespace/std)、標準ライブラリ関数のアドレスを取得する (アドレス指定可能として指定されていない限り) 動作は未定義です。 std::to lower 関数は、このカテゴリに分類されます。

その理由は何ですか?

その理由は、C 標準ライブラリのヘッダー が次のとおりであるという事実にあります。はそのまま C に組み込まれます。これは、tower のような標準 C 関数の動作が、特にアドレスの取得を禁止する C 標準と一致している必要があることを意味します。

結論

結論としては、 std::to lower は、C コード スニペット内のアドレス指定可能なプロパティを持つ標準ライブラリ関数と同様に動作しますが、その基になる C 関数としての実装により、アドレス取得の動作が未定義になります。この動作は std::to lower に固有のものではなく、アドレス指定可能として明示的に指定されていない標準ライブラリ関数に適用されます。

以上が`std::to lower` のような標準ライブラリ関数のアドレスを取得できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。