Даже зная, что вы видели, что они делают то же самое или что .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 ()
Следующий код неверен и может вызвать segfault в вашей программе:
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.
.data()
, поэтому они больше не эквивалентны для неконстантных строк.