Les réponses de Dave S et gbjbaanb sont correct . (Et celle de Luc Danton est correcte aussi, bien qu'il s'agisse plutôt d'un effet secondaire de l'interdiction des chaînes COW que de la règle originale qui l'interdit).
Mais pour dissiper toute confusion, je vais ajouter quelques explications supplémentaires. Divers commentaires renvoient à un de mes commentaires sur le bugzilla de GCC qui donne l'exemple suivant :
std::string s("str");
const char* p = s.data();
{
std::string s2(s);
(void) s[0];
}
std::cout << *p << '\n'; // p is dangling
Le but de cet exemple est de démontrer pourquoi la chaîne de référence comptée (COW) de GCC n'est pas valide en C++11. La norme C++11 exige que ce code fonctionne correctement. Rien dans ce code ne permet au p
pour être invalidée dans C++11.
Utilisation de l'ancien comptage de référence de GCC std::string
ce code a un comportement non défini, parce que p
es invalidée, devenant ainsi un pointeur suspendu. (Ce qui se passe, c'est que lorsque s2
est construit, il partage les données avec s
mais l'obtention d'une référence non conforme via s[0]
exige que les données ne soient pas partagées, donc s
fait une "copie sur l'écriture" parce que la référence s[0]
pourrait potentiellement être utilisé pour écrire dans s
alors s2
sort de son champ d'application, détruisant le tableau pointé par p
).
La norme C++03 permet explicitement ce comportement dans 21.3 [lib.basic.string] p5 où il est dit que suite à un appel à data()
le premier appel à operator[]()
peut invalider les pointeurs, les références et les itérateurs. La chaîne COW de GCC était donc une implémentation C++03 valide.
La norme C++11 ne permet plus ce comportement, car aucun appel à operator[]()
peut invalider des pointeurs, des références ou des itérateurs, qu'ils suivent ou non un appel à la fonction data()
.
Ainsi, l'exemple ci-dessus debe fonctionnent en C++11, mais n'est pas ne fonctionne pas avec le type de chaîne COW de libstdc++, ce type de chaîne COW n'est donc pas autorisé en C++11.
5 votes
Le bug de GCC pour leur chaîne COW est le suivant gcc.gnu.org/bugzilla/show_bug.cgi?id=21334#c45 . Un des bogues qui traque une nouvelle implémentation compilante C++11 de std::string dans libstdc++ est gcc.gnu.org/bugzilla/show_bug.cgi?id=53221