首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用auto,decltype,=,[]声明函数

使用auto,decltype,=,[]声明函数
EN

Stack Overflow用户
提问于 2015-09-21 17:06:27
回答 2查看 134关注 0票数 2

我在以下文件中找到了一个这样定义的函数:

http://en.cppreference.com/w/cpp/language/decltype

我从未见过这种用于定义函数的语法,有人能解释一下吗?

这似乎只适用于自动和解密类型。

代码语言:javascript
复制
#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:

代码语言:javascript
复制
->int      

如果有,那怎么做?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-21 17:16:34

代码语言:javascript
复制
auto f = [](int a, int b)->int
{
    return a * b;
};

这里的f是一个匿名类型的全局变量,包含在operator=之后定义的匿名函数对象的一个实例。这样的匿名函数对象被称为_lambda_s,它们可以发生在任何地方,您可以在其中有一些表达式:

代码语言:javascript
复制
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表达式的一般语法如下:

代码语言:javascript
复制
"["CAPTURE"]" PARAMETERS ["mutable"] [RETURN] { BODY }

CAPTURE是一个零矿石的列表

  • 变量,按值捕获。
  • 变量来自封闭范围,由&预先执行,通过引用捕获
  • &意味着通过引用从封闭作用域捕获所有变量。
  • =意味着按值从封闭作用域捕获所有变量。

PARAMETERS是您从函数中知道的常用参数列表,可以选择(自C++14)使用auto和类型推断。

mutable允许lambda修改其捕获的变量。

可选的RETURN包含返回类型的规范,例如-> voidBODY包含任意表达式和语句。

注意到,这只是语法的粗略草图,但它应该会让您开始学习。您可以在标准中找到更多关于lambda的信息,在Google上搜索"C++11 lambda“,例如这里

顺便说一句,lambda并不可怕,您可以将您的f看作是以下“旧样式”C++代码的大致等价物:

代码语言:javascript
复制
struct {
  int operator()(int a, int b) const {
    return a * b;
  }
} f;
票数 3
EN

Stack Overflow用户

发布于 2015-09-21 17:24:32

当你使用:

代码语言:javascript
复制
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-表达式不包括尾-返回类型,则尾部-返回类型表示以下类型: -如果复合-陈述为表格 {属性-说明符-seqopt return表达式; } 在lvalue到rvalue转换(4.1)、数组到指针转换(4.2)和函数到指针转换(4.3)之后返回的表达式的类型; -否则,无效。 [例子:

代码语言:javascript
复制
 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示例]

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32700860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档