gpt4 book ai didi

c++ - Lambda 表达式 : n3290 draft

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:39:34 24 4
gpt4 key购买 nike

n3290 ISO 草案中的一点:Lambda 表达式:第 5.1.2 节,第 6 段:

         "The closure type for a lambda-expression with no 
lambda-capture has a public non-virtual non-explicit const
conversion function to pointer to function having the same
parameter and return types as the closure type’s function
call operator. The value returned by this conversion
function shall be the address of a function that, when
invoked, has the same effect as invoking the closure
type’s function call operator."

谁能举个例子解释一下这一点?

最佳答案

简短的回答

这只是意味着可以将不捕获任何内容的 lambda 转换为具有相同签名的函数指针:

auto func = [](int x) { return x * 2; };
int (*func_ptr)(int) = func; // legal.

int y = func_ptr(2); // y is 4.

捕获使其成为非法:

int n = 2;
auto func = [=](int x) { return x * n; };
int (*func_ptr)(int) = func; // illegal, func captures n

长答案

Lambda 是创建仿函数的简写:

auto func = [](int x) { return x * 2; };

相当于:

struct func_type
{
int operator()(int x) const { return x * 2; }
}

func_type func = func_type();

在这种情况下,func_type 是“闭包类型”,而 operator() 是“函数调用运算符”。当您获取 lambda 的地址时,就好像您将 operator() 声明为静态并获取其地址,就像任何其他函数一样:

struct func_type
{
static int f(int x) { return x * 2; }
}

int (*func_ptr)(int) = &func_type::f;

当您捕获变量时,它们将成为 func_type 的成员。 operator() 依赖于这些成员,因此不能将其设为静态:

struct func_type
{
int const m_n;

func_type(int n) : m_n(n) {}
int operator()(int x) const { return x * m_n; }
}

int n = 2;
auto func = func_type(n);

普通函数没有成员变量的概念。按照这个想法,如果 lambda 也没有成员变量,则只能将其视为普通函数。

关于c++ - Lambda 表达式 : n3290 draft,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6674506/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com