Это пример из "Ускоренный 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
. Не могли бы вы подтвердить? Если это так, то проблема очень похожа на мой другой вопрос: как функция const member может изменять данные объекта? Я просто хочу быть уверенным.
ссылки const
могут ссылаться на неконстантные объекты, что и произойдет, если вы сделали s += s;
, Константа в этом случае применяется только к объекту при доступе через эту ссылку. Это то же самое, что если вы это сделаете:
Object non_const_object;
Object const & const_ref = non_const_object;
non_const_object.modify(); // okay
const_ref.modify(); // error, even though it the same object
Str
не помечена какconst
потому что функция не помечена какconst
. Если вы сделаетеs
const, это приведет к ошибке, как и ожидалось. Это должно работать нормально, как есть.const Str& s
помечает как const?