C++ 对非转发引用使用std::forward
我试图弄清楚在下面的代码中使用C++ 对非转发引用使用std::forward,c++,c++11,c++17,C++,C++11,C++17,我试图弄清楚在下面的代码中使用std::forward是否有意义,即使它不是转发(=通用)引用。请原谅代码太多,但这是我试图实现的精简版本 template <class... Args> class event_dispatcher { private: using func_t = std::function<bool(Args...)>; public: bool operator()(Args... args) const { for (aut
std::forward
是否有意义,即使它不是转发(=通用)引用。请原谅代码太多,但这是我试图实现的精简版本
template <class... Args>
class event_dispatcher {
private:
using func_t = std::function<bool(Args...)>;
public:
bool operator()(Args... args) const {
for (auto& f : funcs) {
if (!f(args...))
return false;
}
return true;
}
template <class F>
std::enable_if_t<std::is_invocable_r_v<bool, F, Args...>>
add(F&& f) {
funcs.emplace_back(std::forward<F>(f));
}
template <class F>
std::enable_if_t<!std::is_invocable_r_v<bool, F, Args...> && std::is_invocable_v<F, Args...>>
add(F&& f) {
add([f_ = std::forward<F>(f)](Args... args){
std::invoke(f_, std::forward<Args>(args)...); // <-- this is the one I am asking about!
return true;
});
}
private:
std::vector<func_t> funcs;
};
模板
类事件调度器{
私人:
使用func_t=std::function;
公众:
布尔运算符()(Args…Args)常量{
用于(自动&f:funcs){
如果(!f(args…)
返回false;
}
返回true;
}
模板
std::如果启用,则启用
添加(F&&F){
后置功能(标准::前置功能(f));
}
模板
std::如果std::是可发票的,则启用
添加(F&&F){
添加([f=std::forward(f)](Args…Args){
std::invoke(f_u,std::forward(args);//std::move
不移动std::forward
不向前移动
std::forward
是有条件的移动。std::forward
如果T
是值或右值引用,则移动
这与您要移动args…
的时间一致,因此在这里是合适的
在简单转发引用之外使用std::forward
的任何情况下,沿着这些思路进行评论都是一个好主意。对我来说似乎没问题。我建议阅读“有效的现代C++”-Scott Meyers,第5章“右值引用、移动语义和完美转发”