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

C++ const object's member can be modified

本文关键字:对象 成员 const 修改 C++      更新时间:2023-10-16

在此代码中,对象栏是 const 类型,但通过 const 函数,我仍然可以修改成员 x 的值。这不合理吗?

输出为

1525

// 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)。但是,编译器没有义务将错误标记为错误,甚至没有义务检测可能产生未定义行为的所有可能的表达式。

简而言之,你可以搬起石头砸自己的脚,但一个好的编译器至少会在你这样做之前警告你。听听警告。