jeudi 21 juillet 2016

In C++11 and beyond does std::string::operator[] do bounds checking?

I have seen many times that std::string::operator[] does not do any bounds checking. Even In C++, 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);

  1. Requires: pos <= size().
  2. Returns: *(begin() + pos) if pos < size(). Otherwise, returns a reference to an object of type charT with value charT(), where modifying the object leads to undefined behavior.
  3. Throws: Nothing. 4.* Complexity:* constant time.

This leads me to believe that operator[] has 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?

Aucun commentaire:

Enregistrer un commentaire