このコードがあります:
auto fun = [](int x)->int {return x + 1; };
std::cout << typeid(fun).name() << std::endl;
結果は次のとおりです。Z4mainEUliE_
しかし、c++filt はそれが何であるかを説明していないようです。ラムダ式の型とは?
§5.1.2/3 の状態:
ラムダ式の型(クロージャ オブジェクトの型でもあります) は、一意の名前のない非共用体クラス型です。
さらに言い続けますが、それが最も重要な部分です。ラムダは基本的に匿名クラスのインスタンスです。
ちなみに、ラムダのデマングル形式はmain::$_0
.
ラムダ関数の型は、標準では指定されていません (§5.1.2):
ラムダ式の型 (クロージャー オブジェクトの型でもあります) は、名前のない一意の非共用体クラス型 — クロージャー型と呼ばれます — のプロパティについては、以下で説明します。このクラス タイプは集合体ではありません (8.5.1)。クロージャー型は、対応するラムダ式を含む最小のブロック スコープ、クラス スコープ、または名前空間スコープで宣言されます。
次に、クロージャー型が持つべき正確なプロパティをリストします。
したがって、ラムダ関数が持つ一般的な型はありません。コンパイラは、ラムダ関数ごとに名前が指定されていない新しいファンクター型を生成します
ラムダ式の型とは?
ラムダ式の型 (いわゆるクロージャ) は、コンパイラによって自動的に生成される関数呼び出し演算子を持つ名前のないクラス型です。コンパイラが与える内部名は未規定です。
C++11 標準のパラグラフ 5.1.2/3 によると:
ラムダ式の型 (クロージャ オブジェクトの型でもあります) は、一意の名前のない非共用体クラス型— クロージャ型と呼ばれます — のプロパティについては、以下で説明します。このクラス タイプは集合体ではありません (8.5.1)。クロージャー型は、対応するラムダ式を含む最小のブロック スコープ、クラス スコープ、または名前空間スコープで宣言されます。[...]
またname()
、クラスのメンバー関数type_info
( によって返される型typeid()
) も実装依存であり、標準では人間にとって意味のあるものである必要がないことに注意してください。
パラグラフ18.7.1によると:
const char* name() const noexcept;
9戻り値:実装定義のNTBS。
10備考: メッセージは、wstring (21.3、22.4.1.4) として変換および表示するのに適した、null で終了するマルチバイト文字列 (17.5.2.1.4.2) である場合があります。