&str[0]
is safe to use — so long as you do not assume it points to a null-terminated string.
Since C++11 the requirements include (section [string.accessors]):
str.data()
andstr.c_str()
point to a null-terminated string.&str[i]
==str.data() + i
, for0 <= i <= str.size()
- note that this implies the storage is contiguous.
However, there is no requirement that &str[0] + str.size()
points to a null terminator.
A conforming implementation must place the null terminator contiguously in storage when data()
, c_str()
or operator[](str.size())
are called; but there is no requirement to place it in any other situation, such as calls to operator[]
with other arguments.
To save you on reading the long chat discussion below: The objection was been raised that if c_str()
were to write a null terminator, it would cause a data race under res.on.data.races#3 ; and I disagreed that it would be a data race .