struct A {
int &r;
A (int &i) : r(i) {}
void foo () const {
r = 5; // <--- ok
}
};
编译器不会在r = 5;
生成任何错误
这是否意味着&r
已经 const-correct 作为参考(逻辑等价于int* const
)? [这是一个related问题。]
答案 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
,但事实并非如此,并且标准所说的不会发生。