問題タブ [generic-lambda]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
2957 参照

c++ - std::visit の C++17 の例での紛らわしいテンプレート

std::visit()cppreference のページ ( https://en.cppreference.com/w/cpp/utility/variant/visit ) を見ると、理解できないコードに遭遇しました...

短縮版は次のとおりです。

overloadedのすぐ上にある を宣言している 2 行は何int main()を意味していますか?

説明してくれてありがとう!

2019 追加
以下の 2 人の紳士が詳細な説明を提供した後 (どうもありがとうございました!)、非常に優れた本C++17 in Detail - Learn the Exciting Features of The New C++ Standard!で同じコードを偶然見つけました。Bartłomiej Filipekによる。そのようなよく書かれた本!

0 投票する
2 に答える
957 参照

c++ - 汎用ラムダで std::invoke_result_t を使用するとハード エラーが発生する

と同様に機能するメソッドを持つコンテナのようなクラスがありstd::applyます。このメソッドを修飾子でオーバーロードしたいのですが、constこのメソッドをジェネリック ラムダで呼び出そうとすると、 のインスタンス化からハード エラーが発生しますstd::invoke_result_tstd::invoke_result_tメソッドの戻り値を推測し、引数の SFINAE チェックを実行するために使用しています。

Clang 6.0 でコンパイル中のエラー メッセージ:

std::invoke_result_tSFINAE に適しているかどうかはわかりませんが、末尾の戻り値の型に置き換えてみたので、ここでは問題ではないと思います。たとえば、次のようになります。

同様のエラーが発生しました:

質問:

  1. なぜこれが起こるのですか?より正確には、オーバーロードの解決中にラムダの本体がインスタンス化されるのはなぜですか?
  2. どうすれば回避できますか?