struct A {
int &r;
A (int &i) : r(i) {}
void foo () const {
r = 5; // <--- ok
}
};
编译器不会在r = 5;
.
这是否意味着&r
已经是const-correct作为引用(逻辑等价于int* const
)?[这是一个相关的问题。]
struct A {
int &r;
A (int &i) : r(i) {}
void foo () const {
r = 5; // <--- ok
}
};
编译器不会在r = 5;
.
这是否意味着&r
已经是const-correct作为引用(逻辑等价于int* const
)?[这是一个相关的问题。]
我不确定你所说的“已经是正确的”是什么意思,但是:
赋值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
您承诺它不会参与任何此类诡计。
是的,它的逻辑等价于int* const
.
在这种情况下,您可能希望创建和使用适当限定的访问器,以防止对值r
引用进行不必要的更改。
我将const
成员函数解释为隐式插入const
到每个尚未具有此类限定符的数据成员的左侧。这const
已经隐含地用于引用(int & const r;
是非法语法)。换句话说,引用“已经是正确的”以使用您的命名法。
如果成员函数上的限定符具有在每个数据成员的每个可能的有效位置const
插入的效果(例如,数据成员的行为就像在成员函数中一样),那就太好了,但这不是发生的事情,它不是t 标准所说的将会发生。const
int ** foo;
int const * const * const foo;
const