ホームページ > バックエンド開発 > C++ > 単項プラス演算子は、ラムダ式による関数のオーバーロードにおけるあいまいさをどのように解決しますか?

単項プラス演算子は、ラムダ式による関数のオーバーロードにおけるあいまいさをどのように解決しますか?

Barbara Streisand
リリース: 2024-11-16 01:38:02
オリジナル
287 人が閲覧しました

How does the Unary Plus Operator Resolve Ambiguity in Function Overloading with Lambda Expressions?

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 f) は完全に一致しません。

その結果、2 番目のオーバーロードが明確に選択され、最初の呼び出しのあいまいさが解決されます。 .

考慮事項

オーバーロードのあいまいさを解決するための単項トリックは C 標準では明示的に指定されていませんが、一般に信頼できる動作であると考えられています。

ただし、潜在的な混乱や標準の解釈における将来の変更を避けるために、関数ポインター型への明示的なキャストを使用することをお勧めします。

以上が単項プラス演算子は、ラムダ式による関数のオーバーロードにおけるあいまいさをどのように解決しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート