Я говорю не о константном std::string
, а о неконстантном.
И вот почему это утверждение существует (и продолжает существовать даже вC ++ 17, когда был добавлен не-const
data
).Потому что data
не знает, что .
В реализации string
, оптимизированной для небольших строк, сам объект string
хранит массив символов.Если этот string
объект объявлен const
, то и его подобъекты тоже. Модификация объектов, объявленных как const
- это UB .
В отличие от этого vector::data
не имеет такого утверждения, поскольку const vector
всегда выделяет кучу своего массива,Таким образом, хотя массив логически const
извне, он технически хорошо определен (но на самом деле действительно не должен) до const_cast
возвращаемого значения из const
vector::data
, поскольку вы изменяете объект, который не был создан как const
.
Если бы у basic_string::data
не было такого утверждения, реализация на основе единого входа была бы невозможна, потому что это было бы legal для изменения элементов const string
, так же, как законно изменять элементы const vector
.Но это не может быть законно, чтобы изменить его, потому что это может быть const
объект, данные которого хранятся внутри.