Является ли запись в & str [0] буфера (из std: string) корректным поведением в С++ 11?

char hello[] = "hello world";
std::string str;
str.resize(sizeof(hello)-1);
memcpy(&str[0], hello, sizeof(hello)-1);

Этот код имеет поведение undefined в С++ 98. Является ли это законным в С++ 11?

Ответы

Ответ 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.

Ваш пример удовлетворяет требованиям, указанным выше, поэтому поведение корректно определено.