类成员引用变量是否有内置"const-correctness"?

Do class member reference variables have in-built "const-correctness"?

本文关键字:内置 const-correctness 是否 成员 引用 变量      更新时间:2023-10-16
struct A {
  int &r; 
  A (int &i) : r(i) {}
  void foo () const {
    r = 5;  // <--- ok
  }
};

编译器不会在 r = 5; 时生成任何错误。
这是否意味着&r已经是常量正确的参考(逻辑等价于int* const)?[这里有一个相关的问题。

我不确定你所说的"已经正确"到底是什么意思,但是:

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

struct A {
  int * r;
  A (int * i) : r(i) {}
  void foo () const { *r = 5; }
}

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

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

是的,它在逻辑上等同于 int* const .

在这种情况下,您可能希望创建和使用适当限定的访问器,以防止对引用r值进行不必要的更改。

我将const成员函数解释为隐式插入const到每个还没有此类限定符的数据成员的左侧。该const已经隐式存在以供引用(int & const r;是非法语法)。换句话说,引用是"已经正确"的,可以使用您的命名法。

如果成员函数上的const限定符具有在每个数据成员的每个可能的有效位置插入const的影响(例如,数据成员int ** foo;的行为类似于const成员函数中的int const * const * const foo;),那就太好了,但这不是发生的事情,也不是标准所说的会发生。