考虑以下代码:
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)是通过引用捕获的,是否也是转发参考?还是应该以不同的方式编写它以利用转发功能?
就我而言
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是值类型或右值引用类型,则将其强制转换x为X&&。
如果X是左值引用类型,则将其强制转换x为X&。
vlambda主体内部始终是一个左值,但std::forward<T>取决于传递给的原始类型的类型foo。
如果您确定lambda将在与调用相同的调用堆栈中被调用一次foo,则可以安全地通过引用和forward在主体中进行捕获。