类成员引用变量是否具有内置的“const-correctness”?

时间:2012-04-25 12:26:54

标签: c++ reference const-correctness class-members

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

编译器不会在r = 5;生成任何错误 这是否意味着&r已经 const-correct 作为参考(逻辑等价于int* const)? [这是一个related问题。]

3 个答案:

答案 0 :(得分:4)

我不确定你的意思是“已经是正确的”,但是:

分配给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时,你承诺它不会参与任何这样的诡计。

答案 1 :(得分:1)

是的,这是int* const的逻辑等价物。

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

答案 2 :(得分:1)

我将const成员函数解释为隐式地将const插入到尚未具有此类限定符的每个数据成员的左侧。那个const已经隐含了引用(int & const r;是非法语法)。换句话说,引用是“已经 const-correct”来使用你的命名法。

如果成员函数上的const限定符具有在每个数据成员的每个可能有效位置插入const的影响,那将是很好的(例如,数据成员int ** foo;就像int const * const * const foo;成员函数中的const,但事实并非如此,并且标准所说的不会发生。