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

Object rvalue propagation for member function calls

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

struct  F{
  void foo() &  { std::cout << "F::foo() &" << std::endl; }
  void foo() && { std::cout << "F::foo() &&" << std::endl; }
};

另一个结构 A 有一个 F 的副本,并在其函数 bar 中调用 F::foo。我想使用 F::foo() 的正确版本。因此实现是:

struct A{

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

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

  F f;
};

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


一次尝试:

struct B{

  void bar() {
    std::forward<F>(f).foo();
  }
  
  F f;
};

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


Complete example

不,目前没有可用的快捷方式,您需要坚持使用详细版本。但是看看p0847,“演绎this”。但是,不确定该提案的状态。来自摘要:

We propose a new mechanism for specifying or deducing the value category of an instance of a class. In other words, a way to tell from within a member function whether the object it’s invoked on is an lvalue or an rvalue, and whether it is const or volatile.

您可以使用 non-member 函数模板:

struct B{

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

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