Considérons cet extrait, et supposons que a, b, c et d sont des chaînes non vides.std :: string et plusieurs concaténations
std::string a, b, c, d;
d = a + b + c;
Lors du calcul de la somme de ces 3 cas std::string
, les mises en œuvre de la bibliothèque standard de créer un premier objet std::string
temporaire, copie dans sa mémoire tampon interne tampons concaténées de a
et b
, puis effectuer les mêmes opérations entre la chaîne temporaire et le c
. Un codeur programmeur soulignait qu'au lieu de ce comportement, operator+(std::string, std::string)
pouvait être défini pour renvoyer un .
Le rôle même de cet objet serait de différer les concaténations réelles au moment où il est converti en std::string
. Évidemment, operator+(std::string_helper, std::string)
serait défini pour retourner le même assistant, ce qui "garderait à l'esprit" le fait qu'il a une concaténation supplémentaire à effectuer. Un tel comportement permettrait d'économiser le coût CPU de la création de n-1 objets temporaires, l'allocation de leur tampon, leur copie, etc Donc, ma question est: pourquoi ne fonctionne-t-il pas déjà comme ça? Je ne peux pas penser à tout inconvénient ou limitation.
L'inconvénient le plus évident est la complexité ajoutée. – PlasmaHH
En C++ 11, le temporaire peut être réutilisé grâce aux références rvalue. – avakar
@PlasmaHH: La complexité est cachée à l'utilisateur, donc pas particulièrement mauvaise.L'inconvénient principal est qu'il introduit une conversion de type implicite définie par l'utilisateur, qui casserait le code existant qui repose sur une conversion implicite de 'std :: string'. –