成员函数调用的对象右值传播

tom*_*tom 5 c++ rvalue rvalue-reference

我有一个F带有foo不同实现的函数的结构,无论是否F是临时的

struct  F{
  void foo() &  { std::cout << "F::foo() &" << std::endl; }
  void foo() && { std::cout << "F::foo() &&" << std::endl; }
};
Run Code Online (Sandbox Code Playgroud)

另一个结构体在其函数调用中A具有 和 的副本。我想使用正确版本的. 因此,实现是:FbarF::fooF::foo()

struct A{

  void bar() & {
    f.foo();
  }

  void bar() && {
    std::move(f).foo();
  }

  F f;
};
Run Code Online (Sandbox Code Playgroud)

我想知道我是否真的必须提供A::bar(). 难道没有一种聪明的方法可以std::forward用来自动决定F::foo()应该使用哪个吗?


一次尝试:

struct B{

  void bar() {
    std::forward<F>(f).foo();
  }
  
  F f;
};
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用。它F::foo() &&每次都调用。


完整示例

dyp*_*dyp 5

您可以使用非成员函数模板:

struct B{

  template<typename TB>
  friend void bar(TB&& self) {
    std::forward<TB>(self).f.foo();
  }
  
  F f;
};
Run Code Online (Sandbox Code Playgroud)

根据其他函数参数,您可能希望限制 的类型,TB例如is_base_of_v<B, remove_const_t<remove_reference_t<TB>>>