Zunächst ändert es nichts, ob es sich um eine const-Referenz oder -Wert handelt.
Sie müssen dann berücksichtigen, was die Funktion erwartet. Es gibt verschiedene Dinge, die eine Funktion mit einem char*
oder einem char const*
tun kann - die ursprünglichen Versionen von memcpy
verwendeten beispielsweise diese Typen, und es ist möglich, dass solcher Code noch existiert. Hoffentlich ist das selten, und im Folgenden werde ich davon ausgehen, dass die char*
in der C-Funktion auf mit '\0'
terminierte Zeichenfolgen verweisen.
Wenn die C-Funktion ein char const*
erwartet, können Sie ihr die Ergebnisse von std::string::c_str()
übergeben. Wenn sie ein char*
erwartet, hängt es davon ab. Wenn sie ein char*
einfach deshalb erwartet, weil sie aus der Zeit vor const
stammt und tatsächlich nichts ändert, ist std::string::c_str()
gefolgt von einem const_cast
angemessen. Wenn die C-Funktion den char*
als Ausgabeparameter verwendet, wird es jedoch schwieriger. Ich ziehe es persönlich vor, ein char[]
-Puffer zu deklarieren, diesen zu übergeben und dann die Ergebnisse in std::string
umzuwandeln, aber alle bekannten Implementierungen von std::string
verwenden einen zusammenhängenden Puffer, und die nächste Version des Standards wird dies erfordern. Daher kann es auch verwendet werden, die std::string
zuerst korrekt zu dimensionieren (Verwendung von std::string::resize()
, dann Übergeben von &s[0]
und anschließend Neudimensionierung der Zeichenfolge auf die resultierende Länge (ermittelt mit strlen(s.c_str())
, wenn nötig).
Schließlich (aber dies betrifft auch C-Programme, die char[]
verwenden) müssen Sie Lebensdauerfragen berücksichtigen. Die meisten Funktionen, die char*
oder char const*
verwenden, nutzen einfach den Zeiger und vergessen ihn, aber wenn die Funktion den Zeiger irgendwo speichert, um ihn später zu verwenden, muss das Zeichenfolgenobjekt mindestens so lange leben, und seine Größe darf während dieses Zeitraums nicht geändert werden. (In solchen Fällen ziehe ich es erneut vor, ein char[]
zu verwenden.)