OVH Cloud OVH Cloud

std::string : ses caractères sont ils contigüs ?

2 réponses
Avatar
Samuel Krempp
je me demandais si il y avait le même genre de garantie que pour un
std::vector, et que si l'on a

std::string s(100, ' ');
char * p =&s[0];

on pouvait sans crainte accèder aux 100 caractères de s par les poitneurs
coompris dans l'intervalle [p,p+100[

alors donc, peut-on ?
(vu qu'il s'agirait d'addition à la norme, je sais pas trop où chercher ça)

--
Sam

2 réponses

Avatar
Loïc Joly
Samuel Krempp wrote:

je me demandais si il y avait le même genre de garantie que pour un
std::vector, et que si l'on a

std::string s(100, ' ');
char * p =&s[0];

on pouvait sans crainte accèder aux 100 caractères de s par les poitneurs
coompris dans l'intervalle [p,p+100[


Formellement, je ne crois pas. Par contre, si tu écris :
std::string s(100, ' ');
char * p = s.data();

Tu as alors le comportement que tu souhaites.

--
Loïc

Avatar
kanze
Loïc Joly wrote in message
news:<bjh2lk$gn$...
Samuel Krempp wrote:

je me demandais si il y avait le même genre de garantie que pour un
std::vector, et que si l'on a

std::string s(100, ' ');
char * p =&s[0];

on pouvait sans crainte accèder aux 100 caractères de s par les
poitneurs coompris dans l'intervalle [p,p+100[


Formellement, je ne crois pas.


Formellement, certainement pas. À l'encontre de std::vector, la question
a été discutée dans le comité, avant l'adoption, et l'intention est
claire et nette que des implémentations non-contigeës soient permises.
(À l'époque, on s'attendait à ce que rope soit adopté pour être
conforme.)

Par contre, si tu écris :
std::string s(100, ' ');
char * p = s.data();

Tu as alors le comportement que tu souhaites.


Il voulait une erreur de compilation ? Le type de retour de
std::string::data est char const*, et il n'y a aucune garantie formelle
quelle ne pointe pas à une copie.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16