return 来自带有自动参数的 lambda 的值
return values from lambdas with auto parameter
我正在玩 lambda 表达式,我正在使用 auto
作为输入参数。
我试过下面这段代码
auto f2 = [](auto a){ return a;};
std::cout << f2(10) << std::endl;
std::cout << f2("hi there!") << std::endl;
令我大吃一惊的是它可以编译并且 运行 ok!这怎么可能?
如果我没记错(这是 C++14 附带的),函数对象的 operator()
是模板,因为它使用 auto
作为输入参数。
它如何管理多个 return 类型?第一行 returns 一个 int
和第二行 returns const char*
.
编译器是否在幕后创建多个 operator()
?
如您所说,通用 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 类型的规则适用。在第一个函数中,第一个也是唯一一个 return 语句 return 是一个 int
,因此 int
被推导出为 return 类型。 const char*
相同
我正在玩 lambda 表达式,我正在使用 auto
作为输入参数。
我试过下面这段代码
auto f2 = [](auto a){ return a;};
std::cout << f2(10) << std::endl;
std::cout << f2("hi there!") << std::endl;
令我大吃一惊的是它可以编译并且 运行 ok!这怎么可能?
如果我没记错(这是 C++14 附带的),函数对象的 operator()
是模板,因为它使用 auto
作为输入参数。
它如何管理多个 return 类型?第一行 returns 一个 int
和第二行 returns const char*
.
编译器是否在幕后创建多个 operator()
?
如您所说,通用 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 类型的规则适用。在第一个函数中,第一个也是唯一一个 return 语句 return 是一个 int
,因此 int
被推导出为 return 类型。 const char*