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
	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特性。

你可能感兴趣的:(编程语言)