其他分享
首页 > 其他分享> > c – 为什么不调用带有const引用返回值的重载方法?

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

作者:互联网

考虑以下代码:

#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’并确保根据上下文调用正确的版本?即,至少第三次通话

const int& y = a.get_ref();

第二个版本执行? (一个不优雅的解决方案是使用不同的名称,例如get_ref和get_const_ref,但我试图看看是否可以避免这种情况.)

解决方法:

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

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

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

顺便说一句:给他们不同的名字并不是一个坏主意.这就是我们在STL中拥有std::cbeginstd::cend的原因.

标签:c,polymorphism,overloading,reference,const-reference
来源: https://codeday.me/bug/20190828/1752425.html