Почему C ++ не нравится этот синтаксис для строк?

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 будет иметь такой же размер строки справа и иметь одинаковые символы.


Есть идеи?

10000