Почему std::string:: append() менее мощный, чем std::string:: operator +()?

Я заметил, что

std::string str;
str += 'b'; // works
str.append('b'); // does not work
str.append(1, 'b'); // works, but not as nice as the previous

Есть ли причина, почему метод append не поддерживает один символ, который нужно добавить? Я предположил, что operator+= на самом деле является оберткой для метода append, но это, похоже, не так.

Ответ 1

Интересно отметить, что форма append здесь:

string& append( size_type count, CharT ch );

Зеркалирует конструктор, принимающий аналогичный ввод.

basic_string( size_type count, 
              CharT ch, 
              const Allocator& alloc = Allocator() );

И некоторые другие методы, которые принимают count с символом, например resize( size_type count, CharT ch );.

Строковый класс большой, и возможно, что конкретный вариант использования (и перегрузка) для str.append('b'); не рассматривался, или альтернативы считались достаточными.

Простое введение одной перегрузки для этого может ввести неоднозначность, если интегралы int и char соответствуют (на некоторых платформах это может иметь место).

Существует несколько альтернатив append добавления одного символа.

  • Добавление строки, содержащей один символ, может быть выполнено str.append("b");. Хотя это не совсем то же самое, он имеет тот же эффект.
  • Как уже упоминалось, есть operator+=
  • Существует также push_back(), что согласуется с другими стандартными контейнерами

Точка, вероятно, никогда не считалась прецедентом (или достаточно сильным прецедентом), поэтому соответствующая перегрузка/подпись не была добавлена ​​к append, чтобы удовлетворить ее.


Альтернативные проекты могут обсуждаться, но, учитывая зрелость стандарта и этого класса, маловероятно, что они скоро будут изменены - это может очень сильно нарушить много кода.

Можно также рассмотреть альтернативные подписи для append; одним из возможных решений могло быть изменение порядка count и char (возможно, добавление по умолчанию);

string& append(CharT ch, size_type count = 1);

Другой, как описано в некоторой из критике basic_string, заключается в удалении append, существует множество способов достижения того, что это делает.

Ответ 2

Я полагаю, что operator+=() предназначен для обработки всех простых случаев (только с одним параметром), а append() - для вещей, для которых требуется более одного параметра.

Я больше удивляюсь существованию однопараметрических append( const basic_string& str ) и append( const CharT* s ), чем об отсутствии append( CharT c ).

Также обратите внимание на мой комментарий выше: char - это целочисленный тип. Добавление однопараметрической перегрузки целочисленного типа к append() - или конструктор (который по дизайну имеет несколько перегрузок целочисленного типа) может ввести неоднозначность.

Если кто-то не найдет какое-то письменное обоснование, или некоторые члены комитета публикуют здесь то, что они помнят о обсуждении, возможно, как хорошее объяснение, как любое.