对具有可变成员的对象的 const 引用

const reference to object with mutable members

假设我有一个 class 和一个 mutable 成员,并且我对 class 的一个对象进行了多次 const 引用。该标准是否保证这些引用将彼此保持同步?下面是一个例子。

动机:我相信我已经读到编译器对于如何使用 const 引用延长对象的生命周期有多种选择,其中一些实际上涉及复制对象(这当然可能会颠覆首先使用引用的原因之一,但可能是保证对象生存所必需的)。如果这是真的,那么多个引用实际上可以开始像多个对象一样运行吗(mutable 成员具有不同的值)?

示例:

class A {
  public:
    mutable int x;
    A( const int x ) : x( x ) {}
    void f() const;  // Actually changes 'x'.
};

class B {
  public:
    const A & a;
    B( const A & a ) : a( a ) {}
    void f() const { a.f(); }
};

int main() {
  B * b1;
  B * b2;
  {
    A a( 0 );
    b1 = new B( a );
    b2 = new B( a );
  }

  // Do something that would change a mutable variable in 'b1.a' but possibly not in 'b2.a'.
  b1.f();

  return 0;
}

我是这样解释的。 a 已经超出范围,因此编译器必须以某种方式 "keep the original object alive" (这与我对堆栈工作原理的基本理解不相符)或为每个实例复制它B(编译器认为它是安全的,因为它是 const)。但是,我做了一些可能改变了这些实例之一的 mutable 部分的事情。 b1.ab2.a 在这一点上真的不同吗?

如果答案是 "yes," 那么这是合理的,因为我不希望有其他情况。但如果答案是 "no," 我对它的工作原理很感兴趣。

您似乎期望由于引用绑定而延长生命周期。不,谢谢。生命周期延长适用于临时对象,而不是已经存在的具有范围和名称的对象。

即使您将临时传递给 B 的构造函数,它仍然只会被扩展到该语句的末尾 — the extension isn't transitive along a whole chain of reference bindings(并且它不适用于成员参考)。

因此,您试图通过悬空引用访问数据,而您的程序具有未定义的行为。期望 any 结果,或者没有结果。 constmutable 都与它无关。

如果您想知道物理上 您的观察起源于何处,那是take up with your preferred deity