[英]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.a
和b2.a
实际不同?
如果答案是“是”,那么这是合理的,因为我不希望如此。 但是,如果答案是否定的,那么我对它的工作方式非常感兴趣。
似乎由于引用绑定,您期望延长生命周期。 不,谢谢。 生命周期扩展适用于临时对象,而不适用于具有范围和名称的对象。
即使您将临时函数传递给B
的构造函数,它也只会一直扩展到该语句的末尾— 该扩展不能在整个引用绑定链中传递 (并且对成员无效)参考)。
因此,您试图通过一个悬空的引用访问数据,并且您的程序具有未定义的行为。 期待任何结果,或者没有结果。 const
和mutable
都与它无关。
如果您想知道您的观察结果的物理来源,那么您可以选择您喜欢的神灵 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.