C++中的[=]是什么意思?

107
我想知道 [=] 的作用是什么?这里有一个简短的例子。
template <typename T>
std::function<T (T)> makeConverter(T factor, T offset) {
    return [=] (T input) -> T { return (offset + input) * factor; };
}

auto milesToKm = makeConverter(1.60936, 0.0);

如果使用[]而不是[=],代码将如何工作?

我假设

std::function<T (T)>

这意味着一个函数原型,其参数为(T),返回类型为T

3个回答

123
你所说的 [=] 是 lambda 表达式中的 捕获列表 的一部分。这告诉 C++ 编译器在 lambda 表达式创建时初始化,从而使 lambda 表达式得到所有它使用的本地变量的副本。这对于 lambda 表达式能够引用函数内部的本地变量 factoroffset 是必要的。
如果你将 [=] 替换为 [],编译器会报错,因为 lambda 表达式内部的代码不知道变量 offsetfactor 参考什么。许多编译器会给出良好的诊断错误消息,因此可以尝试一下看会发生什么!

14
“这是必要的” - 这个确切选项并不是必要的;我们也可以写成[&][=offset, =input]等。 - M.M
1
@M.M - 这是否捕获对本地变量的引用? - Useless
7
在这里使用引用捕获可能会有问题,因为lambda返回后这些本地变量的生命周期将结束。您是正确的,我们可以逐个列出各个变量。 - templatetypedef

51

这是一个lambda捕获列表。使变量可供lambda使用。您可以使用[=]进行按值复制,或者使用[&]进行按引用传递。


4
你也可以使用 [],它不会捕获任何内容。 :) - Daniel Kamil Kozar

1

我想用注释来提供这些信息,但我的声望太低了。

在cpp20中,使用[=]已经被弃用 - 现在请使用[=,this]。

更多信息请参见:https://isocpp.org/files/papers/p0806r2.html

正如该网站所述:“此更改不会破坏其他有效的C++20代码,最早可能出现从C++17中断的修订版本是C++23。”

因此,在使用cpp20时,请按以下方式使用:

  • [=] → [=,this]:按值传递本地变量,按引用传递类成员
  • [=] → [=,*this]:所有内容都按值传递
  • [&] → [&,this]:所有内容都按引用传递
  • [&] → [&,*this]:(这将是不寻常的)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接