在此代码中,对象栏是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;
}
最佳答案
int& get() const {return x;}
正在向
const
对象的成员返回非const
引用。 (由于*this
声明为const
,我们知道int& get()
是const
。)应该将其标记为错误,因为这是无效的转换(x
未声明为mutable
); gcc和clang都将这样做。您的编译器仅产生警告的事实很奇怪,但是您仍然应该注意该警告。您可以通过显式使用
const_cast<int&>(x)
来避免该错误,但是尝试使用返回的int&
修改x
则是未定义的行为(UB)。但是,编译器没有义务将其标记为错误,甚至不必检测所有可能产生不确定行为的表达式。简而言之,您可以随意射击,但是好的编译器至少会在这样做之前警告您。听警告。