Могу ли я быть уверен, что ссылка на const обновляется при изменении другой сущностью? - PullRequest
0 голосов
/ 02 января 2019

У меня есть класс Foo с правами на чтение экземпляра класса Bar, но у него нет прав на его изменение.В то же время, экземпляр Bar может быть изменен другими элементами.

На данный момент я реализую его следующим образом:

class Foo
{
  private:
    const Bar& bar; // Foo can't modify it
  public:
    Foo(const Bar& bar_) : bar(bar_) {}
    void doSomthing() { this->bar.printData(); }
};

И его можно использовать какэто:

Bar bar;
Foo foo(bar);
bar.update(); // This modify the instance of Bar
foo.doSomthing(); // This use the reference to (modified) bar

Мой вопрос: С этой реализацией могу ли я быть уверен, что компилятор не использует не обновленную копию bar, даже если ссылка объявлена ​​как const?

Если нет, как я могу это сделать?

Примечание: я не использую C ++ 11 для совместимости

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Лучшим стандартным текстом до c ++ 11, который я смог быстро найти, был этот черновик с 2005 года, который должен быть достаточно близок к C ++ 03.

В 3.10 говорится:13 [basic.lval]

Референт выражения с константным выражением не должен изменяться ( через это выражение ), за исключением того, что если он имеет тип класса и имеетизменяемый компонент, этот компонент может быть изменен.

Акцент мой и подчеркивает, что можно ожидать, что референт может быть изменен через другие выражения (если они сами позволяютэто).

0 голосов
/ 02 января 2019

Да, вы можете быть уверены. Ссылки внутренне реализованы в компиляторе как указатели, и оба bar.update(); и Foo::bar действуют в одной и той же ячейке памяти.

Это, конечно, до тех пор, пока нет проблем с гонкой данных, и в этот момент возникают обычные проблемы синхронизации.

...