name_abbreviation = name_last.resize(2);
Здесь я должен назначить первым
name_abbreviation = name_last;
потом
name_abbreviation.resize(2);
Я хотел бы спросить вас, не могли бы вы объяснить, почему другой способ не работает?
Всего 2 ответа
Потому что из-за приоритета оператора этот код:
name_abbreviation = name_last.resize(2);
равно:
name_abbreviation = (name_last.resize(2));
и логически равно:
auto tmp = name_last.resize(2);
name_abbreviation = tmp;
который не компилируется, так как std::string::resize()
ничего не возвращает, и даже если он скомпилируется, он не будет делать то, что вы хотите.
То, что вы хотите сделать, может быть достигнуто путем:
(name_abbreviation = name_last).resize(2);
но это не совсем читаемый код. Я лично предпочел бы 2 отдельных заявления.
Обратите внимание, что тот же результат может быть достигнут гораздо более простым кодом:
name_abbreviation = name_last.substr( 0, 2 );
который также может быть более эффективным в некоторых реализациях.
Функция resize()
ничего не возвращает. Он изменяет размер выделенной памяти для строки, которую он использует. Чтобы присвоить строку другому, просто используйте
name_abbreviation = name_last;
использование оператора =
приведет к тому, что строка на LHS будет иметь такой же размер строки справа и иметь одинаковые символы.