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

bmp9r5qi  于 2023-01-18  发布在  其他
关注(0)|答案(3)|浏览(2265)

我想知道[=]做什么?下面是一个简短的示例

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

vfhzx4xs

vfhzx4xs1#

你所引用的[=]是lambda表达式的捕获列表的一部分,它告诉C++ lambda表达式中的代码被初始化了,这样lambda就可以得到它在创建时使用的所有局部变量的副本,这对于lambda表达式能够引用factoroffset是必要的,它们是函数中的局部变量。
如果你用[]替换[=],你会得到一个编译器错误,因为lambda表达式中的代码不知道变量offsetfactor引用的是什么。如果你这样做,许多编译器会给予很好的诊断错误消息,所以试试看会发生什么!

vpfxa7rd

vpfxa7rd2#

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

wpx232ag

wpx232ag3#

我会用评论来提供这些信息,但我的声誉太低了。
在cpp20中,现在不建议使用[=],而是使用[=,this]。
更多信息请访问:https://isocpp.org/files/papers/p0806r2.html
正如本网站所述,“此更改不会破坏其他有效的C20代码,可能出现C17破坏的最早修订版是C++23。”
因此,在使用cpp20时,请按如下方式使用:

  • [=] → [=,这个]:按值分配局部变量,按引用分配类成员
  • [=] → [=,* 此]:一切按价值
  • [&] → [&,这个]:一切都是参照物
  • [&] → [&,* 此]:(这是不寻常的)

相关问题