在这段代码中,对象栏是一个const类型,但是通过const函数,我仍然可以修改成员x的值。那是不合理的吗?
输出
15 25
// overloading members on constness
#include <iostream>
using namespace std;
class MyClass {
int x;
public:
MyClass(int val) : x(val) {}
int& get() const {return x;}
int& get() {return x;}
};
int main() {
MyClass foo (10);
const MyClass bar (20);
foo.get() = 15;
bar.get() = 25;
cout << foo.get() << '\n';
cout << bar.get() << '\n';
return 0;
}
答案 0 :(得分:5)
int& get() const {return x;}
正在向const
对象的成员返回非const
引用。 (我们知道*this
是const
,因为int& get()
声明为const
。)这应该被标记为错误,因为它是无效的转换({{ 1}}未声明为x
); gcc和clang都会这样做。您的编译器仅生成警告的事实很奇怪,但是您应该留意警告。
您可以通过显式使用mutable
来避免错误,但尝试使用返回的const_cast<int&>(x)
修改int&
将是未定义的行为(UB)。但是,编译器没有义务标记为错误,甚至没有检测到可能产生未定义行为的所有可能表达式。
简而言之,你被允许在脚下射击自己,但是一个好的编译器至少会在你做之前警告你。听取警告。