这是“Accelerated C ++”的示例,12.3.3。代码足够大,所以我只放在最低限度。为了模仿类字符串,实现了自定义类Str,其具有vector<char> data
。运算符+ =重载:
Str& operator+=(const Str& s) {
std::copy(s.data.begin(), s.data.end(), std::back_inserter(data));
return *this;
}
这个运算符显然不能用于s += s;
,它编译成功但产生垃圾(我相信作者的意图是去除额外的细节)。我的问题是为什么它可以编译 - 我们更改const
参数的数据。我假设这是因为我们间接更改了数据:编译器无法知道data
与s.data
相同。能否请你确认?如果是这种情况,那么问题与我的另一个问题非常相似:
How const member function can change an object's data?我只想确定。
答案 0 :(得分:0)
const
引用可能引用非const对象,如果你s += s;
会发生这种情况。在这种情况下,constness仅适用于通过该引用访问时的对象。这与你这样做是一回事:
Object non_const_object;
Object const & const_ref = non_const_object;
non_const_object.modify(); // okay
const_ref.modify(); // error, even though it's the same object