【问题标题】: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-正确性是在位级别评估的,并不关心语义。

标签: c++ reference const-correctness class-members


【解决方案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@ 成员函数),但这不是发生的事情,也不是标准所说的会发生的事情。

      【讨论】:

        猜你喜欢
        • 2013-08-19
        • 2017-06-04
        • 1970-01-01
        • 2017-01-12
        • 2011-10-24
        • 2011-02-05
        • 1970-01-01
        • 1970-01-01
        • 2015-05-13
        相关资源
        最近更新 更多