为什么不调用具有 const 引用 return 值的重载方法?
Why the overloaded method with const reference return value is not called?
考虑以下代码:
#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
但我正在尝试看看是否可以避免这种情况。)
重载解析不依赖于 return 值,而仅依赖于参数,包括成员函数要调用的对象。 a
是一个非常量对象,那么对于a.get_ref()
,会一直调用非常量成员函数。
您可以将其转换为 const
以调用 const 版本:
const_cast<const A&>(a).get_ref();
顺便说一句:给他们不同的名字是个不错的主意。这就是为什么我们在 STL 中有 std::cbegin
and std::cend
。
重载解析仅与调用的参数有关(包括 this
的隐式参数)。表达式 a.get_ref()
必须评估为相同的重载,而不管其返回值发生什么情况。这是 C++ 的基础,对此您无能为力。
如果要调用 const
限定的版本,请使用 const
限定的对象表达式:
const int& y = const_cast<const A&>(a).get_ref();
考虑以下代码:
#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
但我正在尝试看看是否可以避免这种情况。)
重载解析不依赖于 return 值,而仅依赖于参数,包括成员函数要调用的对象。 a
是一个非常量对象,那么对于a.get_ref()
,会一直调用非常量成员函数。
您可以将其转换为 const
以调用 const 版本:
const_cast<const A&>(a).get_ref();
顺便说一句:给他们不同的名字是个不错的主意。这就是为什么我们在 STL 中有 std::cbegin
and std::cend
。
重载解析仅与调用的参数有关(包括 this
的隐式参数)。表达式 a.get_ref()
必须评估为相同的重载,而不管其返回值发生什么情况。这是 C++ 的基础,对此您无能为力。
如果要调用 const
限定的版本,请使用 const
限定的对象表达式:
const int& y = const_cast<const A&>(a).get_ref();