Подтвердить что ты не робот

Является std::string() тем же, что и std::string ("")

Предположим, что у меня есть функция, которая возвращает std::string. Некоторые обстоятельства означают, что строка не заполнена чем-либо.

Возвращает std::string() в точности эквивалентно std::string("")? Например, может ли c_str() или data() предоставить вам одну и ту же последовательность символов? Возможно, std::string("") вызывает оптимизацию коротких строк, но std::string() не делает такой вещи, пока не будут добавлены некоторые символы.

Кто-нибудь знает, говорит ли текущий стандарт (С++ 11) что-то окончательное?

4b9b3361

Ответ 1

Если мы посмотрим на эффекты каждого конструктора в стандарте С++, раздел § 21.4.2 [string.cons]:

Для explicit basic_string(const Allocator& a = Allocator()):

  • data(): ненулевой указатель, который может быть скопирован и может добавить 0 к нему
  • size(): 0
  • capacity(): неопределенное значение

Для basic_string(const charT* s, const Allocator& a = Allocator()):

  • data(): указывает на первый элемент выделенной копии массива, на первый элемент которого указана s
  • size(): traits::length(s)
  • capacity(): значение не менее размера()

Так строго говоря, обе конструкции не идентичны: в частности, емкость построенных объектов std::string может быть разной.

На практике маловероятно, что эта возможная разница будет иметь заметный эффект на ваш код.

Ответ 2

В std::string нет функции-члена, которая позволила бы различать a std::string() и a std::string("").

Я отношусь к философу или логику, чтобы проверить, удовлетворяет ли это любому определению равенства.

Что касается самого стандарта, он утверждает, что std::string() оставит пропускную способность неопределенной, но std::string("") определит емкость как минимум нуля. Таким образом, внутреннее состояние объекта может быть другим.

В моей конкретной реализации STL (MSVC2012) std::string() вызывает функцию с именем _Tidy, тогда как std::string("") вызывает _Tidy и assign. (Инициализация базового класса идентична). assign является стандартной функцией std::string.

Значит, они могут быть разными? Да. Можете ли вы сказать, отличаются ли они? Нет.

Ответ 3

Да, они оба одинаковы. Конструктор по умолчанию std::string подготавливает пустую строку, такую ​​же, как ""

Явный basic_string (const Allocator & alloc = Allocator());
Конструктор по умолчанию. Создает пустую строку (нулевой размер и неуказанная мощность)

basic_string (const CharT * s, const Allocator & alloc = Allocator());
Создает строку с содержимым, инициализированным копией символьной строки с нулевым символом, на которую указывает s. Длина строки определяется первым нулевым символом. Поведение undefined, если s не указывает на массив по крайней мере черт: длина +1 элементов CharT.

Ответ 4

Единственное различие заключается в том, что std::string() знает во время компиляции, что он будет генерировать строку с нулевой длиной, тогда как std::string("") должен использовать strlen или что-то подобное, чтобы определить длину строки, которую он построит на время выполнения. Поэтому конструктор по умолчанию должен быть быстрее.