在此代码中,对象栏是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)。但是,编译器没有义务将其标记为错误,甚至不必检测所有可能产生不确定行为的表达式。

简而言之,您可以随意射击,但是好的编译器至少会在这样做之前警告您。听警告。

09-10 04:07
查看更多