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
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
Loïc Joly <loic.actarus.joly@wanadoo.fr> wrote in message
news:<bjh2lk$gn$1@news-reader3.wanadoo.fr>...
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:kanze@gabi-soft.fr
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
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