次のコードを考えてみましょう。
この中でコードでは、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 サイトの他の関連記事を参照してください。