如何在成员函数内完美转发`*this`对象

jok*_*007 14 c++ overload-resolution c++11 explicit-object-parameter

是否可以*this在成员函数内完美转发对象?如果是的话,我们该怎么做呢?如果不是,那么为什么不呢?我们有哪些替代方案可以达到同样的效果。

请参阅下面的代码片段以更好地理解该问题。

class Experiment {
public:
  double i, j;
  Experiment(double p_i = 0, double p_j = 0) : i(p_i), j(p_j) {}

  double sum() { return i + j + someConstant(); }

  double someConstant() && { return 10; }

  double someConstant() & { return 100; }
};

int main() {
  Experiment E(3, 5);
  std::cout << std::move(E).sum() << "\n";  // prints: 108
  std::cout << E.sum() << "\n";             // prints: 108
}
Run Code Online (Sandbox Code Playgroud)

如果我们认为*this成员函数内的对象double sum()始终是左值或x值(因此是左值),则此输出似乎是预期的。请确认这是否属实。

如何才能完美地将*this对象转发给成员函数someConstant()内部的double sum()成员函数调用呢?

我尝试使用std::forward如下:

double sum() {
    return i + j + std::forward<decltype(*this)>(*this).someConstant();
}
Run Code Online (Sandbox Code Playgroud)

但这没有任何效果,并且double someConstant() &总是调用重载。

use*_*522 10

sum如果没有重载for&&&限定符,这在 C++11 中是不可能的。(在这种情况下,您可以根据特定重载的限定符确定值类别。)

*this就像任何间接寻址的结果一样,它是一个左值,也是调用隐式成员函数的地方。

这将在 C++23 中通过引入可应用常规转发的显式对象参数来修复:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0847r7。 html