length ejemplos array c++ string c++11 buffer language-lawyer

ejemplos - ¿La escritura en & str[0] búfer(de un estándar std: string) está bien definida en C++ 11?



string c++ (1)

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

Este código es un comportamiento indefinido en C ++ 98. ¿Es legal en C ++ 11?


Sí, el código es legal en C ++ 11 porque se garantiza que el almacenamiento para std::string sea ​​contiguo y su código evita sobrescribir el carácter NULO de terminación (o el valor inicializado).

De N3337, §21.4.5 [string.access]

const_reference operator[](size_type pos) const; reference operator[](size_type pos);

1 Requiere: pos <= size() .
2 Devuelve: *(begin() + pos) si pos < size() . De lo contrario, devuelve una referencia a un objeto de tipo charT con el valor charT() , donde la modificación del objeto conduce a un comportamiento indefinido.

Su ejemplo satisface los requisitos establecidos anteriormente, por lo que el comportamiento está bien definido.