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