我应该参考 lambda 吗?

Should I make reference for a lambda?

我应该引用 lambda 以避免复制它吗?

此代码是否会复制 lambda:

auto myLambda = []() {/* do stuff */ }

如果是,我应该这样写吗:

auto &myLambda = []() {/* do stuff */ }

P.S。很抱歉可能是新手问题,用谷歌搜索,但没有找到答案。

你应该使用第一个,因为根据 C++ 标准,第二个是错误格式的。

[expr.prim.lambda]/2:

A lambda-expression is a prvalue whose result object is called the closure object. [ Note: A closure object behaves like a function object. — end note ]

根据 [dcl.init.ref]/5,您不能将纯右值绑定到左值引用。特定编译器似乎接受它的事实并没有改变任何东西。 C++ 由 C++ 标准定义。

事实上,自 C++17 以来,第一个保证不会引入副本——从纯右值初始化保证就地构造值。实际上,每个体面的编译器都会进行复制省略优化,因此您可以放心地假设没有进行复制。

Will this code make a copy of the lambda:

auto myLambda = []() {/* do stuff */ }

没有。复制初始化开始,不管名称中的 copy,只创建一个对象。

and if yes, should I write it like this:

auto &myLambda = []() {/* do stuff */ }

即使那是一个副本,上面的代码在 C++ 中也是非法的。左值引用不能绑定到右值(根据 [expr.prim.lambda]/2:,lambda 表达式是纯右值)。 MSVS 引入了一个允许这样做的扩展——不管我们喜欢与否。 const auto& 会让它起作用,但这几乎肯定是一种悲观情绪。