lub*_*bgr 3 c++ higher-order-functions move-semantics
到目前为止,我已经考虑过传递和调用一个可调用的
template <class Fct, class... Args> void f(Fct&& g, Args&&... args)
{
g(std::forward<Args>(args)...);
}
Run Code Online (Sandbox Code Playgroud)
是要走的路.现在在这个演讲中(在34分钟)和std :: invoke示例实现中,我看到了上述片段的等价性,它在调用它之前有条件地将可调用对象转换为右值引用,
template <class Fct, class... Args> void f(Fct&& g, Args&&... args)
{
std::forward<Fct>(g)(std::forward<Args>(args)...);
}
Run Code Online (Sandbox Code Playgroud)
我假设这个修改只会影响闭包,但我仍然不明白为什么第二个版本更可取:强制转换仅影响rvalue参数,并且在调用时不应复制任何状态,对吗?我还检查了std :: function :: operator()是否被重载&并&&获得了上述代码段替代库的提示,但事实并非如此.
在此先感谢您的提示和答案!
完美转发的目的是尽可能保留原始信息.
g(std::forward<Args>(args)...);将删除原始函数对象的rvalue/lvalue信息,g将始终视为左值.
这将导致可观察到的影响,例如:
struct foo {
void operator()(int) & {
std::cout << "& called\n";
}
void operator()(int) && {
std::cout << "&& called\n";
}
};
Run Code Online (Sandbox Code Playgroud)
foo{}(1)将调用第二个operator().如果你没有使用第一种方法std::forward,f(foo{}, 1)将调用第一种方法operator().
| 归档时间: |
|
| 查看次数: |
72 次 |
| 最近记录: |