web-dev-qa-db-fra.com

L'écriture dans le tampon & str [0] (d'une chaîne std: string) est-elle bien définie en C ++ 11?

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?

28
cubuspl42

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) si pos < size(). Sinon, renvoie une référence à un objet de type charT avec la valeur charT(), 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.

27
Praetorian