1. 程式人生 > >C++14學習筆記(1)——泛型Lambda

C++14學習筆記(1)——泛型Lambda


經過4個月的努力,終於把《C++ Primer》的第5版看完了,第5版增加了C++11的內容。個人喜歡追隨新東西,因此下一步學習目標新標準C++14。 我將發表一系列C++14的學習筆記,歡迎大家指出錯誤。 在看《C++ Primer》的過程中我就是用VC2015來執行程式碼的,經過我的親自試驗,VC2015對C++11的支援是很好的,至少《C++ Primer》中提到的特性全部都支援。因此我將繼續用VC2015學習C++14,看看它對C++14支援到什麼程度。 泛型Lambda C++11中引入了Lambda表示式,但是必須將形式引數宣告為具體的型別。而在C++14中,我們可以使用auto作為形式引數的型別說明:
//程式碼1.1
auto lam = [](auto x, auto y)
{
	return x + y;
};
當我們使用Lambda表示式時,編譯器會自動推導引數和返回值型別:
//程式碼1.2
auto a = lam(3, 4);		//a為int
auto b = lam(4.8, 9.5);		//b為double
有沒有覺得這特別像函式模板嗎?實際上,編譯器就是用函式模板的推導規則來進行推導的,因此程式碼1.1大致相當於:
//程式碼1.3
struct
{
	template<typename T1, typename T2>
	auto operator() (T1 x, T2 y) -> decltype(x + y)
	{
		return x + y;
	}
} lam;
之所以是大致相當於,是因為Lambda表示式可以在函式內部定義,而C++的區域性類不支援成員模板,因此程式碼1.3不能放在函式內部。 既然Lambda表示式支援auto形參,那麼普通函式是否能用auto形參呢,我們來試一下:
//程式碼1.4
//錯誤:普通函式不能使用auto形參
auto add(auto x, auto y)
{
	return x + y;
}
編譯不通過,看來普通函式還是得乖乖地使用template。 以上程式碼本人在VC2015中親自試驗過,VC2015支援泛型Lambda特性。