在这段代码中,对象栏是一个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;
}
Run Code Online (Sandbox Code Playgroud)
int& get() const {return x;}
Run Code Online (Sandbox Code Playgroud)
返回const对const对象成员的非引用.(我们知道这*this是const因为int& get()as 的声明const.)那应该被标记为错误,因为它是无效的转换(x未声明mutable); gcc和clang都会这样做.您的编译器仅生成警告的事实很奇怪,但是您应该留意警告.
您可以通过显式使用来避免错误const_cast<int&>(x),但是尝试使用返回int&的修改将是未定义的行为(UB)x.但是,编译器没有义务标记为错误,甚至没有检测到可能产生未定义行为的所有可能表达式.
简而言之,你被允许在脚下射击自己,但一个好的编译器至少会在你做之前警告你.听取警告.