可以修改C ​​++ const对象的成员

Jia*_*hen 2 c++ const

在这段代码中,对象栏是一个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)

ric*_*ici 5

int& get() const {return x;}
Run Code Online (Sandbox Code Playgroud)

返回constconst对象成员的非引用.(我们知道这*thisconst因为int& get()as 的声明const.)那应该被标记为错误,因为它是无效的转换(x未声明mutable); gcc和clang都会这样做.您的编译器仅生成警告的事实很奇怪,但是您应该留意警告.

您可以通过显式使用来避免错误const_cast<int&>(x),但是尝试使用返回int&的修改将是未定义的行为(UB)x.但是,编译器没有义务标记为错误,甚至没有检测到可能产生未定义行为的所有可能表达式.

简而言之,你被允许在脚下射击自己,但一个好的编译器至少会在你做之前警告你.听取警告.