如何在没有std :: function和auto的情况下定义lambda表达式?

时间:2017-11-27 23:48:04

标签: c++ c++11 lambda

我已经阅读了“Effective Modern C ++”的第31项和http://en.cppreference.com/w/cpp/language/lambda的网页,并想知道我是否可以通过其明确的类型而不是包装类型的std :: function或{{}的关键字来定义lambda。 1}}我怎样才能做到这一点。

例如,类型auto

int

现在,当问题来到lambda时:

auto x_1 = 5; // type deduction
int x_2 = 5;  // defined by definite type
// both x_1, x_2 are int variables of value 5

2 个答案:

答案 0 :(得分:1)

标准说lambda的类型是 unnamed 所以实现创建了一个实现定义的名称,它使用类似于其他未命名的类,结构enumc等。

  

ISO C ++:5.1.2 Lambda表达式[expr.prim.lambda]

     

3 lambda表达式的类型(也是闭包对象的类型)是一个唯一的,未命名的非联合类类型 - 称为闭包类型 - 其属性如下所述

该标准还说,lambda'表现得像一个功能'所以你可以使用std::function模板:

  

[注意:闭包对象的行为类似于函数对象(20.9).- end note]

如果你真的想让你的名字可以使用老式的functors并完成编译器为你做的所有工作lambdas

答案 1 :(得分:1)

在某些情况下,您可以使用函数指针(使用 mvcpp,0x17):

auto usingAuto = []() {
    cout << "autoMagick" << endl;
};
void(*pureCpp)() = []() {
    cout << "pureCpp" << endl;
};

//pureCpp = usingAuto; //you can even assing function pointers from lambdas
//usingAuto = pureCpp;  //error
pureCpp();
usingAuto();