Je viens de découvrir le plus déconcertant d'erreur et je ne comprends pas pourquoi le compilateur n'a pas de drapeau pour moi. Si j'ai écrit ce qui suit:
string s = "abcdefghijkl";
cout << s << endl;
s.substr(2,3) = "foo";
s.substr(8,1) = '.';
s.substr(9,1) = 4;
cout << s << endl;
Le compilateur n'a aucun problème que ce soit avec ce, et les instructions d'affectation ne semblent avoir aucun effet, ce qui est imprimé. En revanche,
s.front() = 'x';
a l'effet que j'avais prévu (depuis front
renvoie une référence à un personnage) de l'évolution des sous-jacents de la chaîne, et
s.length() = 4;
aussi a l'effet attendu de générer une erreur de compilation se plaindre que vous ne pouvez pas affecter de quelque chose qui n'est pas une lvalue, car length
renvoie un entier. (Eh bien, un size_t
de toute façon.)
Alors... pourquoi sur la terre, n'est que le compilateur se plaint pas de l'affectation à la suite d'un substr
appel? Elle renvoie une chaîne de valeur, pas une référence, donc il ne devrait pas être cessible, non? Mais j'ai essayé, en g++
(6.2.1) et clang++
(3.9.0), de sorte qu'il ne semble pas être un bug, et il ne semble pas être sensible à la version C++ (essayé 03, 11, 14).