Voici pourquoi l'élision de copie n'a pas de sens pour les paramètres. Il s'agit en fait de l'implémentation du concept au niveau du compilateur.
L'élision de copie fonctionne essentiellement en construisant la valeur de retour sur place. La valeur n'est pas copiée, elle est créée directement dans sa destination prévue. C'est l'appelant qui fournit l'espace pour la sortie prévue, et donc c'est finalement l'appelant qui fournit la possibilité de l'élision.
Tout ce que la fonction doit faire en interne pour élider la copie est de construire la sortie à l'endroit fourni par l'appelant. Si la fonction peut le faire, vous obtenez l'élision de la copie. Si la fonction ne peut pas le faire, elle utilisera une ou plusieurs variables temporaires pour stocker les résultats intermédiaires, puis les copier/déplacer à l'endroit fourni par l'appelant. Le résultat est toujours construit in-place, mais la construction de la sortie se fait par copie.
Ainsi, le monde extérieur à une fonction particulière n'a pas à savoir ou à se soucier de savoir si une fonction fait l'élision. Plus précisément, le appelant de la fonction n'a pas besoin de savoir comment la fonction est mise en œuvre. Il ne fait rien de différent ; c'est la fonction elle-même qui décide si l'élision est possible.
Le stockage des paramètres de valeur est également fourni par l'appelant. Lorsque vous appelez f(t)
c'est l'appelant qui crée la copie du fichier t
et le transmet à f
. De même, si S
est implicitement constructible à partir d'un int
entonces f(5)
construira un S
du 5 et le passe à f
.
Tout cela est fait par le appelant . L'appelé ne sait pas ou ne se soucie pas de savoir s'il s'agit d'une variable ou d'un temporaire ; on lui donne simplement un emplacement de la mémoire de la pile (ou des registres ou autre).
Rappelez-vous : l'élision par copie fonctionne parce que la fonction appelée construit la variable directement dans l'emplacement de sortie. Donc si vous essayez d'élider le retour d'un paramètre de valeur, alors le stockage du paramètre de valeur doit également être le stockage de sortie lui-même . Mais n'oubliez pas : c'est le appelant qui fournit ce stockage à la fois pour le paramètre et la sortie. Et donc, pour éluder la copie de sortie, l'élément appelant doit construire le paramètre directement dans le sortie .
Pour ce faire, l'appelant doit maintenant savoir que la fonction qu'il appelle élidera la valeur de retour, car il ne peut coller le paramètre directement dans la sortie que si le paramètre est retourné. Cela ne sera généralement pas possible au niveau du compilateur, car l'appelant ne dispose pas nécessairement de l'implémentation de la fonction. Si la fonction est inlined, alors peut-être que cela peut fonctionner. Mais sinon, non.
Par conséquent, le comité C++ n'a pas pris la peine de tenir compte de cette possibilité.