Élision de copie
Le compilateur qui saute entièrement une copie ou un déplacement et construit l'objet directement à sa destination finale. Depuis C++17, le cas important est une obligation, pas une optimisation.
Renvoyer un temporaire — return T{...}; — n'a depuis C++17 plus le droit d'impliquer la moindre copie : l'objet est initialisé directement dans l'espace de l'appelant. La règle est formulée de façon à s'appliquer même aux types qui ne sont ni copiables ni déplaçables, ce qui permet à une fabrique de renvoyer, par exemple, un std::mutex. La variante à variable locale nommée, la NRVO, reste facultative, mais tous les compilateurs raisonnables l'appliquent. Le piège courant : écrire return std::move(x); en croyant aider — c'est l'inverse : l'expression n'est plus un simple nom, la NRVO est désactivée, et l'on obtient un déplacement garanti là où il n'y avait strictement rien à faire.