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

编译器不会在r = 5;.
这是否意味着&r已经是const-correct作为引用(逻辑等价于int* const)?[这是一个相关的问题。]

4

3 回答 3

5

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

赋值r与赋值给传递给构造函数的任何东西是一样的A。在执行此操作时,您不会修改任何内容A,因此声明为 const 的事实foo不是障碍。就好像你已经这样做了:

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

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

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

于 2012-04-25T12:36:02.040 回答
1

是的,它的逻辑等价于int* const.

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

于 2012-04-25T12:33:02.647 回答
1

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

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

于 2012-04-25T12:51:48.700 回答