一個例子:?
int x = 10;
auto add_x = [x](int y) -> int {return x + y;
};
int result = add_x(5); // 結果是 15
lambda
是匿名類型,必須用auto
來接收。(必須寫auto,不可省略)內層
-> auto
是函數的返回類型自動推導(可省略)。
你不能自己聲明
lambda
的真正類型名,因為它是編譯器生成的。lambda
自己就是一個類,沒有名字,auto
是唯一方式。返回值
auto
(-> auto
)表示編譯器自己推導返回類型(大多數場景默認就是這樣)。外層
auto f = ...
是定義變量時自動推導類型。
? 1?? Lambda 本質是什么?
C++ 里的 lambda
表達式是 匿名函數對象,也就是編譯器會幫你在背后自動生成一個 class
,這個 class
會重載 operator()
。
例如:
auto add = [](int x, int y) { return x + y; };
它背后相當于:
struct SomeCompilerGeneratedName {int operator()(int x, int y) const { return x + y; }
};
SomeCompilerGeneratedName add;
所以,lambda
是一個帶 ()
運算符的可調用對象。
? 2?? auto
讓類型推導更方便
當你寫:
auto f = [](int x) { return x * 2; };
這里的 auto
是給 f
用的,意思是:
f
的類型就是那個編譯器生成的、很復雜的lambda
類型。
如果不用 auto
,你沒辦法手動寫出來:
?? f = [](int x) { return x * 2; }; // 你寫不出來那個類型名
所以,auto
是唯一可行的寫法。
? 3?? lambda
的返回值類型可以省略
再看 [] (int x) { return x * 2; }
這一塊。
這里的 return
默認是自動推導的(C++14 及以后):
編譯器會根據
return
語句的類型自己推導出返回值類型。所以你不寫
-> int
也沒關系。
如果是復雜情況,比如需要明確返回類型,可以顯式寫:
[](int x) -> int { return x * 2; }
? 4?? 為什么 auto
是值返回形式常見的選擇
通常寫:
auto f = [](...) { ... };
是因為:
lambda
是匿名類型,必須用auto
來接收。你不能自己聲明
lambda
的真正類型名,因為它是編譯器生成的。
所以你只能寫:
auto f = []() { return 42; };
或者:
auto res = f();
? 5?? 總結
🔑 關鍵點:
lambda
自己就是一個類,沒有名字,auto
是唯一方式。返回值
auto
(-> auto
)表示編譯器自己推導返回類型(大多數場景默認就是這樣)。外層
auto f = ...
是定義變量時自動推導類型。內層
-> auto
是函數的返回類型自動推導(可省略)。
? 舉個典型
auto f = [](int x) -> auto {if (x > 0) return x;else return 0.5; // 不同分支返回不同類型需要 auto
};
在 C++14 及以后,這種情況 auto
返回類型讓編譯器自動推導成 double
(更寬泛的類型)。
?? 總結一行話
lambda
的本質類型你寫不出來,必須用auto
;
lambda
的返回值類型如果簡單可以省略,復雜時可以-> auto
讓編譯器推導。