Const ссылается на объект с изменяемыми членами

sasquires спросил: 03 февраля 2018 в 11:32 в: c++

Предположим, что у меня есть класс с членом 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 на самом деле отличаться на данный момент?

Если ответ "да", тогда это разумно, так как я не ожидал иначе. Но если ответ "нет", мне очень интересно, как это работает.

0 ответов