Даже если вы знаете, что вы видели, что они делают то же самое, или что .data () вызывает .c_str (), неверно полагать, что это будет иметь место для других компиляторов. Также возможно, что ваш компилятор изменится в будущем выпуске.
2 причины использовать std :: string:
std :: string может использоваться как для текстовых, так и для произвольных двоичных данных.
//Example 1
//Plain text:
std::string s1;
s1 = "abc";
//Example 2
//Arbitrary binary data:
std::string s2;
s2.append("a\0b\0b\0", 6);
Вам следует использовать метод .c_str (), когда вы используете вашу строку в качестве примера 1.
Вам следует использовать метод .data (), когда вы используете строку в качестве примера 2. Не потому, что в этих случаях опасно использовать .c_str (), а потому, что вы работаете с двоичными данными более явно для других, просматривающих ваш код.
Возможные ошибки при использовании .data ()
Следующий код неверен и может вызвать ошибку в вашей программе:
std::string s;
s = "abc";
char sz[512];
strcpy(sz, s.data());//This could crash depending on the implementation of .data()
Почему разработчики часто делают .data () и .c_str () одинаковыми?
Потому что это эффективнее. Единственный способ заставить .data () возвращать то, что не завершено нулем, это сделать так, чтобы .c_str () или .data () копировали свой внутренний буфер или просто использовали 2 буфера. Наличие одного буфера с нулевым символом в конце всегда означает, что вы всегда можете использовать только один внутренний буфер при реализации std :: string.