問題タブ [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.
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による。そのようなよく書かれた本!
c++ - 汎用ラムダで std::invoke_result_t を使用するとハード エラーが発生する
と同様に機能するメソッドを持つコンテナのようなクラスがありstd::apply
ます。このメソッドを修飾子でオーバーロードしたいのですが、const
このメソッドをジェネリック ラムダで呼び出そうとすると、 のインスタンス化からハード エラーが発生しますstd::invoke_result_t
。std::invoke_result_t
メソッドの戻り値を推測し、引数の SFINAE チェックを実行するために使用しています。
Clang 6.0 でコンパイル中のエラー メッセージ:
std::invoke_result_t
SFINAE に適しているかどうかはわかりませんが、末尾の戻り値の型に置き換えてみたので、ここでは問題ではないと思います。たとえば、次のようになります。
同様のエラーが発生しました:
質問:
- なぜこれが起こるのですか?より正確には、オーバーロードの解決中にラムダの本体がインスタンス化されるのはなぜですか?
- どうすれば回避できますか?