在方法调用中是否有在该对象上调用 std::forward 的感觉(与参数相反)?

Łuk*_*zyk 2 c++ perfect-forwarding

我想知道std::forward这里是否有感觉。

template <class T>
void juju(T && x) {
  std::forward<T>(x).jaja();
}
Run Code Online (Sandbox Code Playgroud)

我想它没有任何意义,因为它this始终是方法调用中的指针,因此如果它是由右值或左值引用组成的,则没有区别。但请确认我的直觉或解释我为什么错了。

上面的示例是此代码的简化方法,包含jujubeing for_each、TbeingExecutionPolicy和jajabeing get_devices。

for*_*818 5

this当您考虑方法内部时,您走得太快了。在调用成员方法之前,需要进行重载决策。左值和右值引用可以有不同的重载:

#include <utility>
#include <iostream>


template <class T>
void juju(T && x) {
  std::forward<T>(x).jaja();
}

struct foo {
    void jaja() & { std::cout << "hello\n";}
              //^
    void jaja() && { std::cout << "&&\n";}
              //^^
};

int main(){
    juju(foo{});
    foo f;
    juju(f);
}
Run Code Online (Sandbox Code Playgroud)

输出:

&&
hello
Run Code Online (Sandbox Code Playgroud)