为什么不调用带有const引用返回值的重载方法?

时间:2017-05-02 09:25:05

标签: c++ reference polymorphism overloading const-reference

考虑以下代码:

#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_refget_const_ref,但我试图看看是否可以避免这种情况。)

2 个答案:

答案 0 :(得分:5)

重载分辨率不依赖于返回值,而只依赖于参数,包括要为成员函数调用的对象。 a是一个非const对象,然后对于a.get_ref(),将始终调用非const成员函数。

您可以将其强制转换为const,以便调用const版本:

const_cast<const A&>(a).get_ref();
顺便说一句:给他们不同的名字并不是一个坏主意。这就是为什么我们在STL中有std::cbeginstd::cend

答案 1 :(得分:0)

重载解析仅涉及调用的参数(包括this的隐式参数)。表达式a.get_ref()必须评估为相同的重载,无论其返回值发生什么。这是C ++的基础,你无能为力。

如果要调用const - 限定版本,请使用const - 限定对象表达式:

const int& y = const_cast<const A&>(a).get_ref();