Dea*_*ean 6 c++ lambda metaprogramming perfect-forwarding forwarding-reference
我有以下代码,用于调用对象上的函数并以完美转发方式传递任何参数
template <typename F, typename T>
inline auto call_with_args(F&& f, T&& t) {
return [f = std::forward<F>(f), t = std::forward<T>(t)]
(auto&&... args) mutable { return (t.*f)(std::forward<decltype(args)>(args)...); };
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试阅读此内容,但我不确定它的[f = std::forward<F>(f)]作用是什么。这就是“按值捕获”语法,但这有什么关系std::forward(这是我能读到的到右值引用的转换)?是否f使用新变量重新定义,该变量在通用引用绑定到函数参数后被分配任何类型和值类别?ff
有人可以用简单的语言向我解释一下吗?
f和t就是所谓的转发引用,与所有引用一样,它们被视为左值,即使它们引用右值。
所以,因为它们是左值,如果你只是通过像这样的值捕获它们
return [f, t](...) { ... };
Run Code Online (Sandbox Code Playgroud)
然后f和t将被复制到闭包对象中,因为它们是左值。这不太好,因为我们错过了能够移动的机会f以及t它们是否引用了 rvalues 。为了避免这种情况,我们使用std::forward将右值转换回右值,同时将左值保留为左值。
这给你的语法
return [f = std::forward<F>(f)](...) { ... };
Run Code Online (Sandbox Code Playgroud)
它表示创建一个名为 lambda 的成员,并使用周围范围中的来f初始化它。std::forward<F>(f)ff
| 归档时间: |
|
| 查看次数: |
178 次 |
| 最近记录: |