我正在使用lambda表达式,我使用auto
作为输入参数。
我确实尝试过以下代码
auto f2 = [](auto a){ return a;};
std::cout << f2(10) << std::endl;
std::cout << f2("hi there!") << std::endl;
令我惊讶的是,它编译并运行正常!怎么可能?
如果我没有错(这与C ++ 14一起提供),函数对象的operator()
是模板,因为它使用auto
作为输入参数。
如何管理多种退货类型?第一行返回int
,第二行返回const char*
。
编译器是否在幕后创建多个operator()
?
答案 0 :(得分:9)
正如您所说,通用lambda的operator()
实际上是一个函数模板。类似于:
struct noname
{
template<typename T>
auto operator ()(T a) const { return a; }
};
您的单独调用会实例化两个不同的函数。
auto operator ()(int a) const { return a; }
auto operator ()(const char* a) const { return a; }
从那里开始,auto
返回类型的规则适用。在第一个函数中,第一个和唯一的return语句返回int
,因此int
被推断为返回类型。 const char*