標準ライブラリで定義された関数のアドレスを取得できますか?
標準 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 標準ライブラリのヘッダー
結論
結論としては、 std::to lower は、C コード スニペット内のアドレス指定可能なプロパティを持つ標準ライブラリ関数と同様に動作しますが、その基になる C 関数としての実装により、アドレス取得の動作が未定義になります。この動作は std::to lower に固有のものではなく、アドレス指定可能として明示的に指定されていない標準ライブラリ関数に適用されます。
以上が`std::to lower` のような標準ライブラリ関数のアドレスを取得できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。