I have seen many times that std::string::operator[]
does not do any bounds checking. Even What is the difference between string::at and string::operator[]?, asked in 2013, the answers say that operator[]
does not do any bounds checking.
My issue with this is if I look at the standard (in this case draft N3797) in [string.access] we have
const_reference operator[](size_type pos) const; reference operator[](size_type pos);
- Requires:
pos <= size()
.- Returns:
*(begin() + pos)
ifpos < size()
. Otherwise, returns a reference to an object of typecharT
with valuecharT()
, where modifying the object leads to undefined behavior.- Throws: Nothing.
- Complexity: constant time.
This leads me to believe that operator[]
has to do some sort of bounds checking to determine if it needs to return a element of the string or a default charT
. Is this assumption correct and operator[]
is now required to do bounds checking?
The wording is slightly confusing, but if you study it in detail you'll find that it's actually very precise.
It says this:
[]
is either = n or it's < n.charT()
(i.e. the null character).But no rule is defined for when you break the precondition, and the check for = n can be satisfied implicitly (but isn't explicitly mandated to be) by actually storing a charT()
at position n.
So implementations don't need to perform any bounds checking… and the common ones won't.