Я наткнулся на некоторый код, который имеет несколько экземпляров приведенного ниже примера:
std::string str = "This is my string";
char* ptr = const_cast<char*>(str.c_str());
ptr[5] = 'w';
ptr[6] = 'a';
В этом упрощенном примере имеется присвоение std::string::c_str()
, которое возвращает const char*
, указателю char*
с использованием const_cast
.
Кажется, это работает так, как задумано, и str
изменено соответствующим образом.
Но описание std::string::c_str()
в моей местной библиотеке звучит так:
Возвращает константный указатель на содержимое, оканчивающееся нулем. Это дескриптор внутренних данных. Не изменяйте, иначе могут произойти ужасные вещи.
А в cppreference описание включает:
Возвращает указатель на массив символов, заканчивающийся нулем, с данными, эквивалентными тем, которые хранятся в строке.
...
Запись в массив символов, доступ к которому осуществляется через
c_str()
, является поведением undefined.
В стандартном [string.accessors] описание аналогичное и не предоставляется информация об этом ...массиве символов с завершающим нулем с данными, эквивалентными тем, которые хранятся в строке....
Вместо того, чтобы прояснить проблему, это еще больше меня смутило, какой массив символов? Как это эквивалентно? Это копия? И если да, то почему его модифицируют, а также изменяют исходную строку? Определена ли эта реализация?
Я хотел бы избежать задачи по изменению всех экземпляров кода, где это используется, поэтому мой вопрос:
Есть ли способ исправить это, можно ли использовать указатель ptr
для изменения строки str
?
c_str
наdata
, чтобы исправить это. - person Alan Birtles   schedule 07.09.2020std::string
имел гораздо более свободную форму, чем после C++11. Реализации разрешалось делать (но редко) чрезвычайно странные вещи для создания массива символов, возвращаемогоc_str
. - person user4581301   schedule 07.09.2020const_cast
(часто бывает так же плохо, какreinterpret_casr
). - person πάντα ῥεῖ   schedule 07.09.2020str.data()
, он возвращает неконстантный указатель. Или&str.front()
или&str[0]
, если вы уверены, что строка не пуста. Все это создает модифицируемый указатель на буфер строки. - person Igor Tandetnik   schedule 07.09.2020vector<char>
+string_view
пока нет - person Asteroids With Wings   schedule 07.09.2020c_str
. - person anastaciu   schedule 07.09.2020