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

时间:2014-02-09 00:11:21

标签: 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;
}

1 个答案:

答案 0 :(得分:5)

int& get() const {return x;}

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

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

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