类成员引用变量是不是具有内置的“常量正确性”?
Posted
技术标签:
【中文标题】类成员引用变量是不是具有内置的“常量正确性”?【英文标题】:Do class member reference variables have in-built "const-correctness"?类成员引用变量是否具有内置的“常量正确性”? 【发布时间】:2012-04-25 12:26:53 【问题描述】:struct A
int &r;
A (int &i) : r(i)
void foo () const
r = 5; // <--- ok
;
编译器不会在r = 5;
处生成任何错误。
这是否意味着 &r
已经 const-correct 是一个参考(int* const
的逻辑等价物)? [这里有一个related 问题。]
【问题讨论】:
我会因为 const 正确性适用于*this
而不是成员,所以您只修改了引用的对象而不是引用本身。正如您所指出的,类似于指针大小写。
@贾斯汀:是的。该构造函数应该是 A(int&i)。
...更像是内置的 const-incorrectness,但这取决于您问谁...
@Justin,编辑感谢您的指出。
@iammilind:请记住,就 C++ 而言,const
-正确性是在位级别评估的,并不关心语义。
【参考方案1】:
我不确定您所说的“已经 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
ness 的所有可能方式;当您声明成员函数 const
时,您保证它不会使用任何此类诡计。
【讨论】:
【参考方案2】:是的,它在逻辑上等同于 int* const
。
在这种情况下,您可能希望创建和使用适当限定的访问器,以防止对值 r
引用进行不必要的更改。
【讨论】:
【参考方案3】:我将const
成员函数解释为将const
隐式插入到每个尚未具有此类限定符的数据成员的左侧。 const
已经隐含地用于引用(int & const r;
是非法语法)。换句话说,引用“已经 const-correct” 可以使用您的命名法。
如果成员函数上的 const
限定符具有在每个数据成员的每个可能的有效位置插入 const
的效果,那就太好了(例如,数据成员 int ** foo;
的行为类似于 @ 中的 int const * const * const foo;
987654329@ 成员函数),但这不是发生的事情,也不是标准所说的会发生的事情。
【讨论】:
以上是关于类成员引用变量是不是具有内置的“常量正确性”?的主要内容,如果未能解决你的问题,请参考以下文章