我今天正在玩C ++ 14和lambda函数,并尝试编写以下代码:
#include <iostream>
auto getAddFunction() {
return [](auto x, auto y) {
return x+y;
};
}
int main()
{
auto func = getAddFunction();
int x = 3, y = 4;
int z = func(x, y);
std::cout << z << std::endl;
double a = 3.5, b = 4.7;
double c = func(a, b);
std::cout << c << std::endl;
std::complex<double> e {1, 2};
std::complex<double> f {3, 4};
std::complex<double> g = func(e, f);
std::cout << g << std::endl;
return 0;
}
我尝试编译代码,我得到了下面的结果,这是正确的结果:
7
8.2
(4,6)
如果使用模板定义函数getAddFunction
,我就不会理解编译器如何能够产生正确的结果。但是,它是使用auto
定义的,据我所知,编译器会尝试猜测类型,而不是像模板一样为函数生成多个实体。但是这里似乎发生的事情正是模板会发生什么,即编译器为每种不同的数据类型生成多个函数体,即使我使用的是相同的lambda函数变量!
任何人都有解释为什么会这样?