传递转发参考作为Lambda捕获

Art*_*zuk 3 c++ lambda c++11

考虑以下代码:

template <typename C>
void boo (C&& c) {
    c ();
}

template <typename T>
void foo (T&& v) { // (X)
    boo ([&v] () { some_func (std::forward<T> (v)); }); // (Y)
}
Run Code Online (Sandbox Code Playgroud)

就我而言v(X)是转发参考。如果v转发参考(Y)是通过引用捕获的,是否也是转发参考?还是应该以不同的方式编写它以利用转发功能?

Vit*_*meo 6

就我而言v(X)是转发参考。

正确。


如果v转发参考(Y)是通过引用捕获的,是否也是转发参考?

不,v在lambda主体内部是指匿名闭包实例的member变量v。读

some_func (std::forward<T> (v));
Run Code Online (Sandbox Code Playgroud)

some_func (std::forward<T> (this_closure->v));
Run Code Online (Sandbox Code Playgroud)

无论如何,您对std::forward此处的使用都是正确的-如果v传递给foor值,它将传播临时性。

这是因为std::forward<X>(x)这样做:

  • 如果X是值类型或右值引用类型,则将其强制转换xX&&

  • 如果X是左值引用类型,则将其强制转换xX&

vlambda主体内部始终是一个左值,但std::forward<T>取决于传递给的原始类型的类型foo

如果您确定lambda将在与调用相同的调用堆栈中被调用一次foo,则可以安全地通过引用和forward在主体中进行捕获。

否则,您可能想要“通过完美转发捕获”

  • 请注意,如果多次调用lambda,则结果可能是意外的。 (2认同)