1. ホーム
  2. c++

[解決済み] C++14でgeneric lambdaはどのように動作するのですか?

2022-07-18 19:44:44

質問

ジェネリックラムダはどのように動作するのでしょうか( 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のジェネリックスに近いのでしょうか?

上の段落で説明したように、ジェネリックラムダはテンプレート化された呼び出し演算子を持つユニークで無名のファンクタのための単なる構文上の糖分なのです。これがあなたの質問の答えになるはずです :)