Incluso sabiendo que ha visto que ellos hacen lo mismo, o que .data () llama a .c_str (), no es correcto suponer que este será el caso de otros compiladores. También es posible que su compilador cambie con una versión futura.
2 razones para usar std :: string:
std :: string se puede usar tanto para texto como para datos binarios arbitrarios.
//Example 1
//Plain text:
std::string s1;
s1 = "abc";
//Example 2
//Arbitrary binary data:
std::string s2;
s2.append("a\0b\0b\0", 6);
Debe usar el método .c_str () cuando esté usando su cadena como ejemplo 1.
Debe usar el método .data () cuando esté usando su cadena como ejemplo 2. No porque sea peligroso usar .c_str () en estos casos, sino porque es más explícito que está trabajando con datos binarios para otros revisando tu codigo.
Posible error al usar .data ()
El siguiente código es incorrecto y podría causar una falla de segmento en su programa:
std::string s;
s = "abc";
char sz[512];
strcpy(sz, s.data());//This could crash depending on the implementation of .data()
¿Por qué es común que los implementadores hagan que .data () y .c_str () hagan lo mismo?
Porque es más eficiente hacerlo. La única forma de hacer que .data () devuelva algo que no sea terminado en nulo, sería hacer que .c_str () o .data () copie su búfer interno, o simplemente use 2 búferes. Tener un solo búfer terminado en nulo siempre significa que siempre puede usar solo un búfer interno al implementar std :: string.
.data()
, por lo que ya no son equivalentes para cadenas no constantes.