C では、引数としてラムダを使用して関数を呼び出すとき、条件に一致する複数のオーバーロードがある場合、あいまいさが発生する可能性があります。ラムダの型。これにより、コンパイル エラーが発生する可能性があります。
次のコードを考えてみましょう:
#include <functional> void foo(std::function<void()> f) { f(); } void foo(void (*f)()) { f(); } int main() { foo([](){}); // ambiguous }
このコードには、foo の 2 つのオーバーロードがあります。1 つは std::function この曖昧さを解決するには、メソッドの前に単項プラス演算子 () を使用できます。以下に示すラムダ: プラス演算子は、ラムダを関数ポインターに強制的に変換し、foo の 2 番目のオーバーロードを正確に一致させ、曖昧さなく呼び出すことができます。 この動作は、ラムダを含む特定の型を関数ポインターに変換する単項プラス演算子の機能に起因します。この変換関数は次のように定義されます。 ラムダのクロージャー型には関数ポインターへの変換関数があるため、単項プラス演算子はラムダを目的の関数ポインター型に変換し、完全な一致を可能にします。オーバーロードの解決。 以上がC でラムダを引数として渡すときに、オーバーロードされた関数のあいまいさを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。foo(+[](){}); // not ambiguous (calls the function pointer overload)
The operand of the unary + operator shall have arithmetic, unscoped enumeration, or pointer type, and the result is the value of the argument.