类成员引用变量是否具有内置的“常量正确性”?

iam*_*ind 0 c++ reference const-correctness class-members

struct A {
  int &r; 
  A (int &i) : r(i) {}
  void foo () const {
    r = 5;  // <--- ok
  }
};
Run Code Online (Sandbox Code Playgroud)

编译器不会在r = 5;.
这是否意味着作为参考(逻辑等效)&r已经是常量正确int* const?[这是一个相关的问题。]

Gar*_*han 5

我不确定你所说的“已经是常量”是什么意思,但是:

分配给与r分配给传递给 的构造函数的任何事物相同A。在A执行此操作时,您不会在实例中修改任何内容,因此foo声明为 const的事实并不是障碍。就好像你这样做了:

struct A {
  int * r;
  A (int * i) : r(i) {}
  void foo () const { *r = 5; }
}
Run Code Online (Sandbox Code Playgroud)

fooconst的事实意味着它不会修改A它被调用的实例中的任何内容。这与让它修改提供的其他数据之间没有冲突。

当然,如果你碰巧安排r成为对某个成员的引用,A那么调用毕竟foo会修改实例A。编译器无法捕获const可能违反成员函数的所有可能方式;当您声明一个成员函数时,const您承诺它不会进行任何此类诡计。