Il n'y a pas de différence entre ces deux méthodes, et vous devriez utiliser celle qui communique le mieux son intention pour vous.
Paragraphe 12.8/31 sur copie élision spécifie:
Lorsque certains critères sont respectés, une mise en œuvre est autorisé à omettre la construction copier/déplacer d'un objet classe , même si le constructeur sélectionné l'opération de copie/déplacement et/ou le destructeur de l'objet ont des effets secondaires. Dans de tels cas, l'implémentation traite la source et la cible de l'opération comme étant simplement deux manières différentes de se référer au même objet, et la destruction de cet objet se produit à la fin des temps où les deux objets ont été détruits sans l'optimisation. Cette élision des opérations de copie/déplacement, appelé copie élision, est autorisée dans les circonstances suivantes (qui peuvent être combinés pour éliminer les copies multiples):
- dans un communiqué return
en fonction d'un type de retour de classe lorsque l'expression est le nom d'un objet automatique non volatile (autre qu'un paramètre de fonction ou de clause catch) avec le même type cv-non qualifié que le type de retour de fonction, l'opération de copie/déplacement peut être omise en construisant l'objet automatique directement dans la valeur de retour de la fonction
- [...]
Comme vous pouvez le voir, à la fois la création d'un temporaire et un id expression nommant un objet local avec une durée de stockage automatique admissibles pour la copie élision.
De plus, le compilateur traitera la temp
locale comme un rvalue (lire: comme temporaire, dans ce cas) aux fins de celui-ci revenant d'une fonction. Paragraphe 12.8/32 des 11 C++ Précise standard:
Lorsque les critères d'élision d'une opération de copie sont remplies ou seraient réunies, sauf pour le fait que la source objet est un paramètre de fonction, et la l'objet à copier est désigné par un lvalue, la résolution de surcharge à sélectionnez le constructeur pour la copie est d'abord effectuée comme si l'objet était désigné par une valeur. [...]
À cause de cela, je vous suggère fortement suppression la qualification const
du type de retour:
const X operator + (const X& left, const X&right)
// ^^^^^
// Don't use this!
En C++ 11, cela va inhiber la sémantique de mouvement, parce que vous ne pouvez pas passer de un objet const
, même s'il s'agit d'un rvalue - en bref, le constructeur de déplacement de X
, à condition qu'il en existe un, ne soit pas sélectionné et le constructeur de copie sera appelé.
En C++ 11, 'return {left.i + right.i}' est la méthode # 3 qui ... fait aussi la même chose (après des optimisations triviales). – Yakk