Во-первых, константная ссылка или значение ничего не меняет.
Затем вы должны рассмотреть, что ожидает функция. Есть разные вещи, которые функция может делать с char* или char const* --- например, исходные версии memcpy использовали эти типы, и возможно, что такой код все еще существует. Будем надеяться, что это редкость, и в дальнейшем я буду предполагать, что char* в функции C относятся к '\0' завершающим строкам.
Если функция C принимает char const*, вы можете передать ей результаты std::string::c_str(); если это занимает char*, это зависит. Если он принимает char* просто потому, что он датируется до const днями C, и фактически ничего не изменяет, std::string::c_str(), за которым следует const_cast, является подходящим. Однако, если функция C использует char* в качестве выходного параметра, все становится сложнее. Я лично предпочитаю объявлять буфер char[], передавать его, а затем преобразовывать результаты в std::string, но все известные реализации std::string используют непрерывный буфер, и следующая версия стандарта потребует его, поэтому сначала правильно определите размер std::string (используя std::string::resize() , затем можно использовать передачу &s[0] и последующее изменение размера строки до полученной длины (определяемой с помощью strlen(s.c_str()), если необходимо).
Наконец (но это также проблема для программ C, использующих char[]), вы должны учитывать любые проблемы жизненного цикла. Большинство функций, принимающих char* или char const*, просто используют указатель и забывают о нем, но если функция где-то сохраняет указатель для последующего использования, строковый объект должен существовать как минимум столько же времени, и его размер не должен изменяться в течение этого периода. (Опять же, в таких случаях я предпочитаю использовать char[].)
person
James Kanze
schedule
12.04.2011