Suppose I have a function that returns a std::string
. Certain circumstances mean that the string is not populated with anything.
Is returning std::string()
exactly equivalent to std::string("")
? For example, would c_str()
or data()
give you the same character sequence? Perhaps the std::string("")
invokes a short string optimisation but std::string()
does no such thing until some characters are added.
Does anyone know if the current standard (C++11) says anything definitive?
There's certainly no member function on std::string
that would allow you to distinguish between a std::string()
and a std::string("")
.
I defer to a philosopher or logician to verify if that satisfies any definition of equality.
As for the standard itself, it states that std::string()
will leave the capacity unspecified but std::string("")
will define a capacity of at least zero. So the internal state of the object could be different.
On my particular STL implementation (MSVC2012), std::string()
calls a function called _Tidy
whereas std::string("")
calls _Tidy
and assign
. (The base class initialisation is identical). assign
is a standard std::string
function.
So could they be different? Yes. Can you tell if they are different? No.
If we look at the effects of each constructor in the C++ standard, section § 21.4.2 [string.cons] :
For explicit basic_string(const Allocator& a = Allocator())
:
data()
: a non-null pointer that is copyable and can have 0 added to itsize()
: 0capacity()
: an unspecified value
For basic_string(const charT* s, const Allocator& a = Allocator())
:
data()
: points at the first element of an allocated copy of the array whose first element is pointed at by ssize()
:traits::length(s)
capacity()
: a value at least as large as size()
So strictly speaking, both constructs are not identical : in particular, the capacity of the constructed std::string
objects might be different.
In practice, it's unlikely that this possible difference will have any observable effect on your code.
Yes, they are both same. Default constructor of std::string
prepares an empty string same as ""
explicit basic_string( const Allocator& alloc = Allocator() );
Default constructor. Constructs empty string (zero size and unspecified capacity)
basic_string( const CharT* s, const Allocator& alloc = Allocator() );
Constructs the string with the contents initialized with a copy of the null-terminated character string pointed to by s. The length of the string is determined by the first null character. The behavior is undefined if s does not point at an array of at least Traits::length(s)+1 elements of CharT.
The only difference is that std::string()
knows at compile-time that it will produce a zero-length string, while std::string("")
has to use strlen
or something similar to determine the length of the string it will construct at run-time. Therefore the default-constructor should be faster.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With