Ответ 1
Да, код является законным в С++ 11, потому что хранилище для std::string
гарантировано будет смежным, и ваш код избегает перезаписывания завершающего символа NULL (или инициализированного значения CharT
).
Из N3337, §21.4.5 [string.access]
const_reference operator[](size_type pos) const; reference operator[](size_type pos);
1 Требуется:
pos <= size()
.
2 Возвращает:*(begin() + pos)
, еслиpos < size()
. В противном случае возвращается ссылка на объект типаCharT
со значениемcharT()
, где изменение объекта приводит к поведению undefined.
Ваш пример удовлетворяет требованиям, указанным выше, поэтому поведение корректно определено.