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 tipocharT
con 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.