【问题标题】:return values from lambdas with auto parameter使用 auto 参数从 lambdas 返回值
【发布时间】:2015-03-19 23:22:07
【问题描述】:

我正在使用 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()

【问题讨论】:

  • 如何将 lambda 写成函数模板?
  • 我不认为标准规定了函数对象应该如何实现。即,它们不限于依赖模板或旧式仿函数。
  • 编译器是否在幕后创建了多个operator() 是的,函数模板每次使用不同的模板参数实例化时都会创建不同的函数。 lambda 没有做任何特别的事情。

标签: c++ c++11 lambda c++14


【解决方案1】:

正如你所说,泛型 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*也一样

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多