Имеет ли значение, как вы инициализируете строку в современном C ?

#c

#c

Вопрос:

Есть ли разница или это просто вопрос предпочтений? Я новичок в c , и меня беспокоит, что я не уверен, что выбираю правильный способ инициализации строкового значения.

Если бы я просто выбрал один способ, который работает для подавляющего большинства вариантов использования, какой бы это был?

 // Initializing from a literal.
std::string s1{"hello"};
std::string s2("there");
std::string s3 = {"what"};
std::string s4 = "is";

// Initializing from another string object.
std::string s5{s1};
std::string s6(s1);
std::string s7 = s1;
std::string s8 = {s1};
  

PS: Прошу прощения, если этот вопрос во всей его полноте задавался ранее, я нигде не мог его найти и был бы признателен, если бы кто-нибудь мог дать на него ссылку здесь.

Комментарии:

1. Я рекомендую изменить формулировку вашего вопроса, чтобы спросить об общих технических различиях между этими различными способами инициализации строки, поскольку запрос «правильного способа» может быть закрыт как не относящийся к теме (в основном основанный на мнении).

2. Я ожидаю, что современные компиляторы C будут генерировать идентичный код для всех логически эквивалентных альтернатив. Так что это чисто вопрос личного мнения и предпочтений.

3. @MaxVollmer — Хороший вызов — немного отредактировал вопрос.

4. @SamVarshavchik — Спасибо, не могли бы вы констатировать это как факт, что все компиляторы будут рассматривать их как эквивалентные? Или существуют определенные ситуации, когда одно предпочтительнее другого? Немного странно, что c допускает так много способов инициализации строки, за этим должны быть какие-то причины, кроме обратной совместимости?

Ответ №1:

В частности, для строк вы всегда сможете использовать все вышеперечисленное, и это действительно просто вопрос личных предпочтений.

Я лично предпочитаю

 auto s1 = std::string(); //Initialize empty string
auto s2 = std::string("Hello, world"); // Initialize string containing "Hello, world"
auto s3 = s2; //Make a copy of s2
auto s4 = std::move(s3); //Move s3 into s4
  

И причина, по которой я предпочитаю это, заключается в том, что это работает со всеми типами. Вы не можете забыть инициализировать что-либо, если используете auto:

 int i; //Oops, forgot to initialize i, because i is a primitive
  

Против:

 auto i = 0; //i set to 0
auto i2 = size_t(0); //i2 is a size, and set to 0
auto i3; //Error: forgot to initialize
  

Важно сохранять согласованность во всей кодовой базе.