Les expressions sont toujours évaluées au point où le programme les atteint. Le résultat d'une expression est toujours une valeur (ou un vide).
Les valeurs ont un type et les expressions ont une catégorie de valeur, qui se combinent pour choisir quelle surcharge d'un ensemble de surcharge est utilisée, à un usage particulier.
Dans votre cas, string operator+(...)
donne une valeur de chaîne, avec la catégorie pr-value (qui est un type de valeur). Il est alors immédiatement lié à une chaîne & &, donc sa durée de vie est étendue à celle de la référence.
Si vous l'avez affecté à la place à une chaîne simple, string& string::operator=(string&&)
aurait été choisi par rapport aux autres surcharges de cet opérateur. Notez que depuis C++ 11, le compilateur est autorisé (et à partir de C++ 17 requis) pour matérialiser la valeur directement dans l'objet cible. Ce processus est connu sous le nom d'élision copier/déplacer ou (N) RVO, pour l'optimisation de la valeur de retour (nommée).
Merci pour la réponse rapide. Il semble que si 's2' était juste un autre' std :: string', les résultats seraient les mêmes, mais les binaires résultants seraient-ils différents? –
@BradyDean Oui, le résultat est le même. C'est difficile à dire sur les binaires de résultats; Quoi qu'il en soit, je l'ai essayé [ici] (https://gcc.godbolt.org/) et il a donné le même assemblage. – songyuanyao
Notez que cela change dans C++ 17 d'une manière qui fait zéro différence observable dans ce cas. – Yakk