对具有可变成员的对象的 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.a
和 b2.a
在这一点上真的不同吗?
如果答案是 "yes," 那么这是合理的,因为我不希望有其他情况。但如果答案是 "no," 我对它的工作原理很感兴趣。
您似乎期望由于引用绑定而延长生命周期。不,谢谢。生命周期延长适用于临时对象,而不是已经存在的具有范围和名称的对象。
即使您将临时传递给 B
的构造函数,它仍然只会被扩展到该语句的末尾 — the extension isn't transitive along a whole chain of reference bindings(并且它不适用于成员参考)。
因此,您试图通过悬空引用访问数据,而您的程序具有未定义的行为。期望 any 结果,或者没有结果。 const
和 mutable
都与它无关。
如果您想知道物理上 您的观察起源于何处,那是take up with your preferred deity。
假设我有一个 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.a
和 b2.a
在这一点上真的不同吗?
如果答案是 "yes," 那么这是合理的,因为我不希望有其他情况。但如果答案是 "no," 我对它的工作原理很感兴趣。
您似乎期望由于引用绑定而延长生命周期。不,谢谢。生命周期延长适用于临时对象,而不是已经存在的具有范围和名称的对象。
即使您将临时传递给 B
的构造函数,它仍然只会被扩展到该语句的末尾 — the extension isn't transitive along a whole chain of reference bindings(并且它不适用于成员参考)。
因此,您试图通过悬空引用访问数据,而您的程序具有未定义的行为。期望 any 结果,或者没有结果。 const
和 mutable
都与它无关。
如果您想知道物理上 您的观察起源于何处,那是take up with your preferred deity。