考虑以下代码:
#include <iostream>
using namespace std;
class A {
private:
int x;
public:
int& get_ref() {
cerr << "non const" << endl;
return x;
}
const int& get_ref() const {
cerr << "const" << endl;
return x;
}
};
int main () {
A a;
a.get_ref() = 10;
cout << a.get_ref() << endl;
const int& y = a.get_ref();
return 0;
}
我希望第二次和第三次调用a.get_ref()
运行第二版get_ref()
方法(并在标准错误上输出const
)。但看起来总是第一个版本被调用。如何实现两个不同的getter&amp;'s并确保根据上下文调用正确的版本?即,至少是第三次电话
const int& y = a.get_ref();
执行第二个版本? (一个不优雅的解决方案是使用不同的名称,例如get_ref
和get_const_ref
,但我试图看看是否可以避免这种情况。)
答案 0 :(得分:5)
重载分辨率不依赖于返回值,而只依赖于参数,包括要为成员函数调用的对象。 a
是一个非const对象,然后对于a.get_ref()
,将始终调用非const成员函数。
您可以将其强制转换为const
,以便调用const版本:
const_cast<const A&>(a).get_ref();
顺便说一句:给他们不同的名字并不是一个坏主意。这就是为什么我们在STL中有std::cbegin和std::cend。
答案 1 :(得分:0)
重载解析仅涉及调用的参数(包括this
的隐式参数)。表达式a.get_ref()
必须评估为相同的重载,无论其返回值发生什么。这是C ++的基础,你无能为力。
如果要调用const
- 限定版本,请使用const
- 限定对象表达式:
const int& y = const_cast<const A&>(a).get_ref();