char hello[] = "hello world";
std::string str;
str.resize(sizeof(hello)-1);
memcpy(&str[0], hello, sizeof(hello)-1);
Ce code est un comportement indéfini en C++ 98. Est-ce légal en C++ 11?
Oui, le code est légal en C++ 11 car le stockage de std::string
Est garanti contigu et votre code évite d'écraser le caractère NULL de fin (ou la valeur initialisée CharT
).
Depuis N3337, §21.4.5 [string.access]
const_reference operator[](size_type pos) const; reference operator[](size_type pos);
1 Requiert:
pos <= size()
.
2 renvoie:*(begin() + pos)
sipos < size()
. Sinon, renvoie une référence à un objet de typecharT
avec la valeurcharT()
, où la modification de l'objet conduit à un comportement indéfini.
Votre exemple répond aux exigences énoncées ci-dessus, donc le comportement est bien défini.