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

C 20 の標準ライブラリ関数のアドレスを取得できますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-27 02:54:18605ブラウズ

Can You Take the Address of Standard Library Functions in C  20?

標準ライブラリ関数のアドレスは取得できますか?

背景

次のコードを考えてみましょう。

この中でコードでは、std::invoke への呼び出しが 2 つあります。行 #1 は std::boolalpha のアドレスを取得し、行 #2 は std::to lower を使用して同じことを試みます。期待される出力は 'a' です。

アドレス指定可能な関数

疑問が生じます: 期待される出力は C 20 で保証されていますか?これに答えるには、アドレス指定可能な関数の概念を詳しく掘り下げる必要があります。

[namespace.std] によると、明示的にアドレス指定可能として指定されていない限り、標準ライブラリ関数へのポインタまたはその参照を取得しようとすることは未定義の動作です。 (おそらく形式が悪い)。この禁止事項は、標準ライブラリの非静的メンバー関数のメンバーへのポインターの形成にも及びます。

分析

行 #1:

std ::boolalpha は、[fmtflags.manip] によってアドレス可能な関数として指定されます。これは、アドレスの取得が整形式であることを意味し、std::cout.setf(std::ios_base::boolalpha).

行 #2:

残念ながら、std::to lower は [cctype.syn] でアドレス指定可能として明示的に指定されていません。したがって、行 #2 のアドレス取得の試みは未定義の動作になります (おそらく不正な形式です)。

結論

期待される出力は保証されません。実際、行 #2 の未定義の動作のため、コードはコンパイルさえ保証されていません。

アドレス指定可能なメンバー関数

この問題はメンバー関数にも当てはまります。 [namespace.std] に記載されているように、ポインターが標準ライブラリのメンバー関数に渡された場合の動作は未定義です。

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

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