我有一个类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
答案 0 :(得分:1)
是的,您可以确定。引用在编译器内部作为指针实现,并且bar.update();
和Foo::bar
都作用于相同的内存位置。
当然,只要不存在数据争用问题,这时就会出现常见的同步问题。
答案 1 :(得分:-1)
我能很快找到的最好的pre c ++ 11标准文本是2005年的this draft,它应该足够接近C ++ 03。
在3.10:13 [basic.lval]中说
不得修改const限定表达式的引用(通过该表达式),除非它是类类型并且具有可变组件,则可以修改该组件。
>
重点是我的,并强调希望通过其他表达方式(如果它们本身允许的话)可以修改引用对象 。