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章“右值引用、移动语义和完美转发”