8
votes

Le code suivant invoque-t-il un comportement non défini?

Je voudrais faire quelque chose comme ça xxx

ma question est la suivante: l'ordre de l'argument de la fonction est indéterminé, il est donc prudent de passer une valeur qui sera déplacée d'une argument, et le résultat de l'appelant une autre fonction avec la même instance , passée comme référence-à-const, comme l'autre argument?

Je pense que la question se résume à la fois quand, précisément, l'opération de déplacement réelle est effectuée, un point sur lequel je ne suis pas tout à fait clair (surtout quand il s'agit d'une optimisation allumée).


0 commentaires

3 Réponses :


9
votes

Le "déménagement" réel ne se produirait pas tant que le constructeur de déplacement de std :: unique_ptr est exécuté (tous std :: mouvement () est lancer le const FoopTr & RValue dans un FOOPTR && RValue Référence). Cela ne se produirait pas tant que les deux arguments Baz Constructeur que vous déléguez sont invoqués. Pour que cela se produise, tous les arguments à ce constructeur doivent être évalués en premier. Par conséquent, toute utilisation de l'objet FOO dans l'évaluation de ces arguments se produira avant le "mouvement" réel de l'instance unique_ptr .

Puisque vous passez le FOOPTR (AKA std :: unique_ptr par valeur et std :: unique_ptr est mobile- Seulement, cela déclenchera une construction de déménagement lors de l'évaluation de la première dispute au constructeur à deux arguments. L'ordre d'évaluation des arguments étant indéterminé, que le déplacement peut ne pas se produire avant l'évaluation du deuxième argument. Par conséquent, le comportement de votre Exemple est non spécifié.



4
votes

std :: Déplacer n'est pas une opération, il s'agit d'une référence à une référence de valeur R. L'opération de déplacement se produira à l'intérieur de l'autre Baz constructeur. En conséquence, ce que vous faites devrait fonctionner.


1 commentaires

Sans copie élision, le premier constructeur Baz d'argument effectue une construction de mouvement, ce qui peut arriver avant ou après la barre d'appel dans le deuxième argument. Donc le résultat n'est pas spécifié



4
votes

Scott Meyers a mentionné un Similaire So question dans son poste Devrait-il déplacer uniquement des types que de valeur? . Il semble qu'il n'y ait pas de réponse définitive si elles devraient être transmises par la valeur ou non, mais cela peut clairement conduire à un comportement non spécifié et, dans votre cas, cela fait aussi.


0 commentaires