Является std::string() тем же, что и std::string ("")
Предположим, что у меня есть функция, которая возвращает std::string
. Некоторые обстоятельства означают, что строка не заполнена чем-либо.
Возвращает std::string()
в точности эквивалентно std::string("")
? Например, может ли c_str()
или data()
предоставить вам одну и ту же последовательность символов? Возможно, std::string("")
вызывает оптимизацию коротких строк, но std::string()
не делает такой вещи, пока не будут добавлены некоторые символы.
Кто-нибудь знает, говорит ли текущий стандарт (С++ 11) что-то окончательное?
Ответы
Ответ 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
или что-то подобное, чтобы определить длину строки, которую он построит на время выполнения. Поэтому конструктор по умолчанию должен быть быстрее.