[解決済み] C++14でgeneric lambdaはどのように動作するのですか?
質問
ジェネリックラムダはどのように動作するのでしょうか(
auto
キーワードを引数の型として使用) は C++14 標準ではどのように機能するのでしょうか。
これは C++ のテンプレートに基づくもので、異なる引数型ごとにコンパイラは同じ本体で型を置き換えた新しい関数を生成します(コンパイル時多相性)、あるいは Java のジェネリックス(型消去)に近いのでしょうか?
コードの例です。
auto glambda = [](auto a) { return a; };
どのように解決するのですか?
汎用ラムダが導入されたのは
C++14
.
単純に、ラムダ式で定義されたクロージャ型には
をテンプレート化した
という通常の非テンプレート呼び出し演算子ではなく、テンプレート化された
C++11
のラムダ(もちろん
auto
が少なくとも一度はパラメータリストに現れる場合)。
では、あなたの例では
auto glambda = [] (auto a) { return a; };
を作成します。
glambda
をこの型のインスタンスにします。
class /* unnamed */
{
public:
template<typename T>
T operator () (T a) const { return a; }
};
C++14 標準草案 n3690 の 5.1.2/5 項では、与えられたラムダ式のクロージャ型の呼び出し演算子がどのように定義されるかが規定されています。
非一般的なラムダ式のクロージャ型には、パブリック インライン関数呼び出し演算子(13.5.4)があります。 そのパラメータと戻り値の型はラムダ式のパラメータ宣言節と戻り値の型によってそれぞれ記述されます とtrailing-return-typeによってそれぞれ記述されます。 一般的なラムダでは、クロージャ型はパブリックなインライン関数コール 演算子メンバテンプレート(14.5.2)があり、そのテンプレートパラメータリストは、ラムダ内のautoの出現ごとに1つの発明型テンプレートパラメータから構成されています。 ラムダのパラメータ宣言節にあるautoの各出現に対して、出現の順に . テンプレートパラメータは,対応するパラメータ宣言が以下のように宣言している場合,パラメータパックとなります. 関数パラメータパックです (8.3.5).関数コール 関数呼び出し演算子テンプレートの戻り値型と関数パラメータは,ラムダ式の trailing-return-type と parameter-declarationclauseから派生します. パラメータ宣言句の宣言指定子におけるautoの各出現箇所を を対応するテンプレートパラメータの名前に置き換えます。
最後に
<ブロッククオートこれはテンプレートに似ていて、異なる引数の型ごとにコンパイラは同じボディで型を変えた関数を生成するのでしょうか、それともJavaのジェネリックスに近いのでしょうか?
上の段落で説明したように、ジェネリックラムダはテンプレート化された呼び出し演算子を持つユニークで無名のファンクタのための単なる構文上の糖分なのです。これがあなたの質問の答えになるはずです :)
関連
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] リスト内包とラムダ+フィルタの比較
-
[解決済み] クロージャ」と「ラムダ」の違いは何ですか?
-
[解決済み] Distinct() with lambda?
-
[解決済み】C++11のラムダ式って何?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。