类成员引用变量是不是具有内置的“常量正确性”?

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; 处生成任何错误。 这是否意味着 &amp;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 的实例。编译器无法捕获可能违反成员函数constness 的所有可能方式;当您声明成员函数 const 时,您保证它不会使用任何此类诡计。

【讨论】:

【参考方案2】:

是的,它在逻辑上等同于 int* const

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于类成员引用变量是不是具有内置的“常量正确性”?的主要内容,如果未能解决你的问题,请参考以下文章

具有易失性和外部数据访问的 C++ 常量正确性

避免代码重复(常量正确性)redux

移动语义+对成员成员变量的引用 - 解决方案和命名法?

java反射机制

返回对成员变量数据的引用的开销

GeekBand-secondweek-c++的组合和继承