Just had an interesting argument in the comment to one of my questions. My opponent claims that the statement \"\"
does not contain \"\"<
The first thing that is unclear is whether you are talking about std::string
or null terminated C strings, the second thing is why should it matter?. I will assume std::string
.
The requirements on std::string
determine how the component must behave, not what its internal representation must be (although some of the requirements affect the internal representation). As long as the requirements for the component are met, whether it holds something internally is an implementation detail that you might not even be able to test.
In the particular case of an empty string, there is nothing that mandates that it holds anything. It could just hold a size member set to 0 and a pointer (for the dynamically allocated memory if/when not empty) also set to 0. The requirement in operator[]
requires that it returns a reference to a character with value 0, but since that character cannot be modified without causing undefined behavior, and since strict aliasing rules allow reading from an lvalue of char type, the implementation could just return a reference to one of the bytes in the size
member (all set to 0) in the case of an empty string.
Some implementations of std::string
use small object optimizations, in those implementations there will be memory reserved for small strings, including an empty string. While the std::string
will obviously not contain a std::string
internally, it might contain the sequence of characters that compose an empty string (i.e. a terminating null character)