将转发引用作为lambda捕获传递
Passing forwarding reference as lambda capture
考虑以下代码:
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)
}
就我而言,CCD_ 2中的CCD_ 1是转发参考。如果v
是通过引用捕获的,那么它是否也是(Y)
中的转发引用?或者我应该用不同的方式来写它以利用转发?
就我而言,
(X)
中的v
是转发引用。
正确。
如果
v
是通过引用捕获的,它是否也是(Y)
中的转发引用?
否,lambda主体内的v
引用匿名闭包实例的成员变量v
0。读取
some_func (std::forward<T> (v));
作为
some_func (std::forward<T> (this_closure->v));
无论如何,这里使用std::forward
是正确的——如果传递给foo
的v
是一个右值,它将传播临时性。
这是因为std::forward<X>(x)
这样做:
如果
X
是值类型或右值引用类型,则它将x
强制转换为X&&
。如果
X
是左值引用类型,则它将x
强制转换为(X)
0。
lambda体内的v
始终是一个左值,但std::forward<T>
取决于传递给foo
的原始类型的类型。
如果您确信lambda将在与foo
调用相同的调用堆栈中被调用一次,那么通过引用和主体中的forward
捕获是安全的
否则,您可能想要"通过完美转发捕获">。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 可组合的lambda/std::函数与std::可选
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 正在折叠转发引用
- 如何将lambda作为模板类的成员函数参数
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 在 lambda 捕获中声明的变量的类型推导
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 模板函数指针和lambda
- 可变参数模板:将整数参数完美转发到 lambda
- 将转发 lambda 转换为函数指针
- 完美的转发在lambda中
- 关于Lambda超载,输入转换和完美转发的问题
- 将转发引用作为lambda捕获传递
- 完美的异步lambda转发
- 如何将函数和参数包转发到 lambda 中,转发到 std::thread 的构造函数中
- 在 lambda 中捕获完美转发的变量
- std::将右值ref转发到lambda