Unary Plus を使用した関数のオーバーロードにおけるあいまいさの解決
指定されたコード スニペット内:
void foo(std::function<void()> f) { f(); } void foo(void (*f)()) { f(); } int main() { foo([]() {}); // ambiguous foo(+[]() {}); // not ambiguous (calls the function pointer overload) }
最初の呼び出し引数としてラムダ式を使用した to foo は、あいまいさのためコンパイルに失敗します。ただし、ラムダが関数ポインターのオーバーロードに解決される前の単項での 2 番目の呼び出しは、
単項プラスの役割
[] で使用される演算子は単項です。プラス演算子。 C 標準では、算術、スコープなし列挙型、またはポインター型のオペランドをオペランドの値に変換することとして定義されています。
この場合、ラムダ式は算術型ではありませんが、変換できます。
関数ポインター型への変換
C 標準によれば、ラムダ キャプチャのないラムダ式には、ポインターへのパブリック変換関数があります。ラムダの関数呼び出し演算子と同じパラメータと戻り値の型を持つ関数。
したがって、単項はラムダ式を関数ポインタ型 void (*)() に強制的に変換します。
オーバーロードの解決
2 番目のオーバーロード void foo(void (*f)()) は、引数の型 void (*)() であるため、オーバーロード解決で完全に一致します。パラメータのタイプと一致します。最初のオーバーロード void foo(std::function
その結果、2 番目のオーバーロードが明確に選択され、最初の呼び出しのあいまいさが解決されます。 .
考慮事項
オーバーロードのあいまいさを解決するための単項トリックは C 標準では明示的に指定されていませんが、一般に信頼できる動作であると考えられています。
ただし、潜在的な混乱や標準の解釈における将来の変更を避けるために、関数ポインター型への明示的なキャストを使用することをお勧めします。
以上が単項プラス演算子は、ラムダ式による関数のオーバーロードにおけるあいまいさをどのように解決しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。