gpt4 book ai didi

c++ - 通用 lambda : syntactic sugar or not?

转载 作者:行者123 更新时间:2023-11-27 23:03:35 24 4
gpt4 key购买 nike

C++14 泛型 lambda 是否为语言带来了真正的改进,还是它们是一种语法糖?是否有一些情况

[](auto param1, auto param2, /* ... */ auto paramN)
{
return /* ... */;
}

不能替换为

template <typename Type1, typename Type2, /* ... */ typename TypeN>
auto foo(Type1&& param1, Type2&& param2, /* ... */ TypeN&& paramN)
{
return /* ... */;
}

struct bar
{
template <typename Type1, typename Type2, /* ... */ typename TypeN>
auto operator()(Type1&& param1, Type2&& param2, /* ... */ TypeN&& paramN)
{
return /* ... */;
}
};

?


@Kerrek SB提供了非常有趣的链接 in the comments这说明了通用 lambda 的强大功能:

最佳答案

对于 C++11 的非泛型 lambda 表达式,可以执行一种比较直接的转换:

void foo()
{
int i = 42; int j = 22;
auto f = [i, &j](int k) { return i + j + k };
// proceed to use f
}

例如:

void foo()
{
int i = 42; int j = 22;
struct {
int i; int& j;
// can't deduce return type
int operator()(int k) const
{ return i + j + k; }
} f { i, j };
// proceed to use f
}

对于 C++14 的通用 lambda 表达式,就没那么简单了。假设这次我们使用 auto f = [i, &j](auto k) { return i + j + k; }。然后我们必须产生以下调用运算符:

template<typename T>
auto operator()(T k) const { return i + j + k; }

问题是我们不能在函数范围内定义模板(这种限制也称为无本地模板)。因此,我们必须将闭包类型定义从封闭函数移出到命名空间范围(在过程中为其命名),然后使用 closure_type f { i, j };。顺便说一句,这意味着我们必须为类及其运算符提供某种形式的链接,而函数局部定义没有链接。

所以在某种意义上,通用 lambda 表达式为我们提供了局部函数模板的有限版本。

关于c++ - 通用 lambda : syntactic sugar or not?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25382363/

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