我应该参考 lambda 吗?
Should I make reference for a lambda?
我应该引用 lambda 以避免复制它吗?
此代码是否会复制 lambda:
auto myLambda = []() {/* do stuff */ }
如果是,我应该这样写吗:
auto &myLambda = []() {/* do stuff */ }
P.S。很抱歉可能是新手问题,用谷歌搜索,但没有找到答案。
你应该使用第一个,因为根据 C++ 标准,第二个是错误格式的。
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&
会让它起作用,但这几乎肯定是一种悲观情绪。
我应该引用 lambda 以避免复制它吗?
此代码是否会复制 lambda:
auto myLambda = []() {/* do stuff */ }
如果是,我应该这样写吗:
auto &myLambda = []() {/* do stuff */ }
P.S。很抱歉可能是新手问题,用谷歌搜索,但没有找到答案。
你应该使用第一个,因为根据 C++ 标准,第二个是错误格式的。
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&
会让它起作用,但这几乎肯定是一种悲观情绪。