L'un d'eux appelle string(char const*, count)
l'autre string(string const&, pos)
.
L'un récupère les 3 premiers caractères d'un tampon, l'autre tous les caractères après le 3ème.
Cela s'explique par le fait que le C++ dispose de tampons de caractères bruts et de chaînes de caractères std. "this is not a std::string"
. "this is a std string"s
, std::string so_is="this";
.
std::string
a plus de 30 ans et a été ajouté au langage C++ sans être suffisamment soigné (contrairement à la STL, qui a subi plus d'itérations avant d'être ajoutée).
Son interface est honnêtement trop riche, et vous pouvez rencontrer des problèmes de ce genre ; de multiples surcharges qui mènent à des résultats confus.
0 votes
S1 et S2 devraient être les mêmes, à moins que je ne manque quelque chose.
3 votes
Avez-vous lu la référence en
std::string
des constructeurs ?"Modern C++"
n'est pas unstd::string
mais un tableau de caractères (qui est automatiquement converti en un pointeur char), et il y a un constructeur différent pour ceux-ci.40 votes
Bien sûr. La référence vous le dirait. Et je suis sûr qu'il y a une raison incroyablement intelligente pour laquelle ils ne font pas la même chose, que le comité de la bibliothèque C++ me prouverait en utilisant une logique et un raisonnement impeccables. Et pourtant, ce n'est qu'une raison de plus - bien que minime - pour laquelle la bibliothèque standard C++ reste peu intuitive, voire frustrante, à utiliser.
2 votes
@HolyBlackCat néanmoins, le résultat devrait être le même, merci quand même.
0 votes
Oui, ça devrait.
4 votes
La "raison étonnamment intelligente" est que std::string a été conçu il y a plusieurs dizaines d'années, donc, avec le recul, certains de ses constructeurs et fonctions ne correspondent pas à ce que nous considérons comme une interface intuitive moderne.
1 votes
@M.M. : Ça, plus le fait que les cordes de style C ont été conçues il y a encore plus longtemps, et
std::string
ont dû travailler avec leurs conventions. Cela dit, il aurait probablement fallu s'en tenir à la même sémantique de chaîne de caractères de style C pour les deux, au lieu de faire en sorte qu'une position soit un point de départ efficace pour la fonctionstd::string
et un point final effectif pourchar *
donc votre point de vue est toujours valable, je souligne simplement que les contraintes de compatibilité dans ce domaine sont antérieures même à l'arrivée de l'euro.std::string
.1 votes
C'est vraiment un exemple parfait de la raison pour laquelle certains pourraient prétendre que le C++ "craint".
0 votes
@M.M La cohérence et la logique ne sont pas des inventions récentes.
1 votes
Je pense que le vrai problème est que chaque classe n'a qu'un seul nom de constructeur - le nom de la classe. Vous ne pouvez pas avoir des constructeurs différents pour la même classe avec des noms différents, et vous ne pouvez avoir que des constructeurs multiples à cause de la surcharge. Des surcharges différentes avec le même nom faisant des choses différentes sont malodorantes, mais c'est ce que nous devons faire pour les constructeurs. Sauf que ce que vous devriez probablement faire, c'est construire en mouvement à partir d'une fonction nommée qui renvoie la valeur que vous voulez - n'utilisez pas du tout tous les constructeurs qui prêtent à confusion, ce sont des reliques obsolètes de l'OMI datant d'une époque antérieure à la sémantique du mouvement.