我在以下文件中找到了一个这样定义的函数:
http://en.cppreference.com/w/cpp/language/decltype
我从未见过这种用于定义函数的语法,有人能解释一下吗?
这似乎只适用于自动和解密类型。
#include <iostream>
using namespace std;
auto f = [](int a, int b)->int
{
return a * b;
};
/*
int f = [](int a, int b) //DOES NOT WORK
{
return a * b;
};
*/
int main()
{
int a = 2, b = 3;
cout<<f(a,b);
return 0;
}我不确定当我们这样做时,下面的函数是否使用dectype:
->int 如果有,那怎么做?
发布于 2015-09-21 17:16:34
auto f = [](int a, int b)->int
{
return a * b;
};这里的f是一个匿名类型的全局变量,包含在operator=之后定义的匿名函数对象的一个实例。这样的匿名函数对象被称为_lambda_s,它们可以发生在任何地方,您可以在其中有一些表达式:
int main(int, char**) {
([](int a) {
cout << "lambda called with " << a << endl;
})(42);
return ([](int a, int b) { return a - 2 * b; })(42, 21);
}这种lambda表达式的一般语法如下:
"["CAPTURE"]" PARAMETERS ["mutable"] [RETURN] { BODY }CAPTURE是一个零矿石的列表
&预先执行,通过引用捕获&意味着通过引用从封闭作用域捕获所有变量。=意味着按值从封闭作用域捕获所有变量。PARAMETERS是您从函数中知道的常用参数列表,可以选择(自C++14)使用auto和类型推断。
mutable允许lambda修改其捕获的变量。
可选的RETURN包含返回类型的规范,例如-> void和BODY包含任意表达式和语句。
注意到,这只是语法的粗略草图,但它应该会让您开始学习。您可以在标准中找到更多关于lambda的信息,在Google上搜索"C++11 lambda“,例如这里。
顺便说一句,lambda并不可怕,您可以将您的f看作是以下“旧样式”C++代码的大致等价物:
struct {
int operator()(int a, int b) const {
return a * b;
}
} f;发布于 2015-09-21 17:24:32
当你使用:
auto f = [](int a, int b)->int
{
return a * b;
};f类型是lambda表达式的类型。它不是int,它是lambda表达式的返回类型。
就-> int部分而言,这是惟一可以显式指定lambda表达式返回类型的语法。如果省略了返回类型,则由编译器使用标准指定的算法推导返回类型:
5.1.2 Lambda表达式 4如果lambda表达式不包括lambda声明器,则就好像lambda声明器是()一样。如果lambda-表达式不包括尾-返回类型,则尾部-返回类型表示以下类型: -如果复合-陈述为表格
{属性-说明符-seqoptreturn表达式; }在lvalue到rvalue转换(4.1)、数组到指针转换(4.2)和函数到指针转换(4.3)之后返回的表达式的类型; -否则,无效。 [例子:
auto x1 = [](int i){ return i; }; // OK: return type is int
auto x2 = []{ return { 1, 2 }; }; // error: the return type is void (a
// braced-init-list is not an expression)-end示例]
https://stackoverflow.com/questions/32700860
复制相似问题