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)sipos < size(). De lo contrario, devuelve una referencia a un objeto de tipocharTcon el valorcharT(), 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.