関数ポインタと std::function を使用して関数をオーバーロードすると、次の場合があいまいになる可能性があります。ラムダ式を引数として渡そうとしています。このあいまいさは、ラムダ式が関数ポインターと std::functions の両方に暗黙的に変換できるという事実から生じています。
このあいまいさを解決するには、ラムダ式の前に単項プラス演算子 ( ) を使用できます。演算子はラムダを強制的に関数ポインター型に変換します。この場合、それは void ()() です。これにより、オーバーロード解決で foo(void (f)()) の関数ポインター オーバーロードを明確に選択できるようになります。
次のコードは、曖昧さを解決するための演算子の使用法を示しています。
#include <functional> void foo(std::function<void()> f) { f(); } void foo(void (*f)()) { f(); } int main() { foo([]() {}); // ambiguous foo(+[]() {}); // not ambiguous (calls the function pointer overload) }
ラムダ式の型変換ルールと単項プラス演算子の効果を理解することで、関数のあいまいさを効果的に解決できます。ラムダ式を引数として渡すときのポインターのオーバーロード。
以上がラムダ式を使用した関数ポインターのオーバーロードにおけるあいまいさを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。