【发布时间】:2022-03-05 06:55:09
【问题描述】:
是否可以在成员函数中完美转发*this 对象?如果是,那么我们该怎么做呢?如果不是,那为什么不呢?我们有什么替代方案才能达到同样的效果。
请查看下面的代码 sn-p 以更好地理解问题。
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
}
如果我们认为成员函数 double sum() 内的 *this 对象始终是左值或 xvalue(因此是 glvalue),则此输出似乎是预期的。请确认是否属实。
我们如何才能完美地将*this对象转发到double sum()成员函数内部的成员函数调用someConstant()?
我尝试如下使用std::forward:
double sum() {
return i + j + std::forward<decltype(*this)>(*this).someConstant();
}
但这没有任何效果,double someConstant() & 重载是总是被调用的。
【问题讨论】:
标签: c++ c++11 overload-resolution