繁体   English   中英

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

[英]const reference to object with mutable members

假设我有一个具有mutable成员的类,并且我对该类的对象采用了多个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已经超出范围,因此编译器不得不以某种方式“保持原始对象处于活动状态”(这与我对栈的工作原理的基本理解不能很好地融合在一起)或为每个B实例制作一个副本(编译器认为它是安全的,因为它是const )。 但是,我所做的事情可能改变了这些实例之一的mutable部分。 b1.ab2.a实际不同?

如果答案是“是”,那么这是合理的,因为我不希望如此。 但是,如果答案是否定的,那么我对它的工作方式非常感兴趣。

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

即使您将临时函数传递给B的构造函数,它也只会一直扩展到该语句的末尾— 该扩展不能在整个引用绑定链中传递 (并且对成员无效)参考)。

因此,您试图通过一个悬空的引用访问数据,并且您的程序具有未定义的行为。 期待任何结果,或者没有结果。 constmutable都与它无关。

如果您想知道您的观察结果的物理来源,那么您可以选择您喜欢的神灵

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM