2013-07-22 4 views
0

Я читаю о классе строк STL. Он упоминается ниже:Оператор преобразования для класса строк

Строка строки STL выбирает не определять операторы преобразования, а использует методы c_str() и data() для прямого доступа к памяти. STL намеренно не включает неявные операторы преобразования, чтобы предотвратить неправильное использование необработанных указателей строк.

Мой вопрос

  1. c_str() возвращает константный символ * указатель и по-прежнему пользователь может изменить значение строки. Я прав?
  2. Что означает автор, чтобы «предотвратить неправильное использование необработанных указателей строк»? Пожалуйста, объясните, желательно с примером.

Спасибо!

+2

1. Как вы думаете, что означает 'const'? –

+1

1. Вы можете изменить строку, но ** не ** через указатель, возвращаемый 'c_str()' или 'data()'. 2. Изменение содержимого базовых строковых данных без сохранения инвариантов. Например, путем изменения с помощью указателя, возвращаемого 'c_str()' или 'data()'. – juanchopanza

+0

... http://c2.com/cgi/wiki?StlIsNotTheCppStandardLibrary – StoryTeller

ответ

2

Нет, вы не можете использовать возвращаемое значение std::string::c_str(), чтобы изменить строку. Попытка сделать это - неопределенное поведение. И проблема была (и до сих пор) время жизни указателя вернулась std::string::c_str(). Он становится недействительным, если строка разрушена, или если какая-либо неконстантная функция вызывается в строке . Вопросы, такие вещи, как:

char const* s = string1 + string2; 
// s is invalid here. 

VS.

char const* s = (string1 + string2).c_str(); 
// s is invalid here. 

В первом случае, это легко сделать ошибку, не реализующего его, поэтому комитет решил не иметь неявный преобразование, так что это было бы незаконным. Во втором случае вам действительно нужно.

Смежные вопросы