c++ - 通用 C++14 lambda 和与模板的关系

标签 c++ lambda c++14

我确实读过带有 auto 参数的 C++14 泛型 lambda 实际上是模板,所以下面是有效的 C++14

auto glambda = [] (auto a) { return a; };
cout << glambda(23); // Prints 23
cout << glambda('A'); // Prints A

这与我从模板中了解到的不太相符。实例化点在哪里?如果第一个调用用 int 实例化一个模板,第二个用 char 实例化一个模板,它存储在 glambda 变量中的是什么?

最佳答案

并不是说“lambda 是一个模板”——这没有意义,lambda 是一个表达式。相反,由 lambda 表达式定义的闭包对象的类型 具有一个由成员函数模板定义的重载函数调用运算符。所以实例化点是第一次使用各自的调用操作符。

换句话说,lambda [a, &b](auto x, auto y) -> R {/* ... */} 的类型如下:

struct __lambda
{
    __lambda(const A & __a, B & __b) : a(__a), b(__b) {}

    template <typename T1, typename T2>
    R operator()(T1 x, T2 y) const { /* ... */ }

private:
    A a;
    B & b;
};

关于c++ - 通用 C++14 lambda 和与模板的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36987655/

相关文章:

c++ - 如何在C++(QT框架)中构建一个带有UTF字符的字符串

C++0x : overloading on lambda arity

java - 从 Optional 流式传输列表

c++ - 减少实体组件系统中的 Duck-typing 劣势

c++ - 有没有比迭代更好的方法在 C++ 中执行 URL 模式匹配?

c++ - 从 Vector3f 转换为 Matrix4f

PHP/C++ : shm_open() error when sharing memory

linq - 动态 LINQ 和动态 Lambda 表达式?

c++ - 将一种类型映射到另一种类型以使用自己的算法

C++14 从可变参数模板创建 vector