В первой части c_str()
возвращает const char*
, и это означает, что он говорит.Все, что const_cast
достигает в этом случае, - это то, что ваше неопределенное поведение компилируется.
Во второй части, в C ++ 0x std::string
гарантированно имеет непрерывное хранилище, как и std::vector
в C ++03.Поэтому вы можете использовать &s[0]
, чтобы получить char*
для передачи вашим функциям, если строка не пуста.На практике у всех string
реализаций, которые в настоящее время находятся в активной разработке, уже есть непрерывное хранилище: на стандартном заседании комитета был проведен соломенный опрос, и никто не предложил контрпример.Таким образом, вы можете использовать эту функцию сейчас, если хотите.
Однако , std::string
использует принципиально иной формат строки, чем строки в стиле C, а именно data + length, а не nul-terminated,Если вы измените строковые данные из ваших функций C, вы не сможете изменить длину строки и не сможете быть уверены, что в конце есть нулевой байт без c_str()
.И std::string
может содержать встроенные nuls, которые являются частью данных, поэтому, даже если вы нашли nul, не зная длины, вы все равно не знаете, что нашли конец строки.Вы очень ограничены в том, что вы можете делать в функциях, которые будут корректно работать с обоими видами данных.