Const-аргумент функции-члена изменяется этой функцией

0

Это пример из "Ускоренный 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 может изменять данные объекта? Я просто хочу быть уверенным.

  • 0
    Изменяемая Str не помечена как const потому что функция не помечена как const . Если вы сделаете s const, это приведет к ошибке, как и ожидалось. Это должно работать нормально, как есть.
  • 0
    @chris Крис Что ты имеешь в виду? Разве const Str& s помечает как const?
Показать ещё 2 комментария
Теги:
arguments
const

1 ответ

0
Лучший ответ

ссылки 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
  • 0
    Итак, вы подтверждаете мое предположение: s.data является const, но компилятор не знает, что это то же самое, что и data.
  • 0
    @TT_: компилятор может знать или не знать, но это не имеет значения. Будет ошибка, если вы попытаетесь получить доступ к неконстантным функциям через константную ссылку на объект, независимо от того, сможет ли он выяснить, является ли этот объект действительно константным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню