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