c – 为什么或何时应该在调用之前将可调用函数参数转换为rvalue
发布时间:2020-12-16 09:21:12 所属栏目:百科 来源:网络整理
导读:到目前为止,我已经考虑过传递和调用一个可调用的 template class Fct,class... Args void f(Fct g,Args... args){ g(std::forwardArgs(args)...);} 是要走的路.现在在this talk(在34分钟)和std::invoke示例实现中,我看到上面的代码片段的等价性,它在调用它之
到目前为止,我已经考虑过传递和调用一个可调用的
template <class Fct,class... Args> void f(Fct&& g,Args&&... args) { g(std::forward<Args>(args)...); } 是要走的路.现在在this talk(在34分钟)和std::invoke示例实现中,我看到上面的代码片段的等价性,它在调用它之前有条件地将可调用对象转换为右值引用, template <class Fct,Args&&... args) { std::forward<Fct>(g)(std::forward<Args>(args)...); } 我假设这个修改只影响闭包,但我仍然不明白为什么第二个版本更可取:强制转换只会影响rvalue参数,并且在调用时不应复制任何状态,对吗?我还检查了std::function::operator()是否超载了&和&&通过替代上述代码段的库获得提示,但事实并非如此. 在此先感谢您的提示和答案! 解决方法
完美转发的目的是尽可能保留原始信息.
克(标准::向前<参数数量>(参数)…);将删除原始函数对象的rvalue / lvalue信息,g将始终视为左值. 这将导致可观察到的影响,例如: struct foo { void operator()(int) & { std::cout << "& calledn"; } void operator()(int) && { std::cout << "&& calledn"; } }; foo {}(1)将调用第二个operator().如果你使用没有std :: forward的第一种方法,f(foo {},1)将调用第一个operator(). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |