Je tente de mettre à jour du code qui distingue un nouvel objet. L'objectif est de le gérer avec un pointeur intelligent. Bouilli, il ressemble beaucoup à ceci:
class X { shared_ptr<Y> yptr; X() : yptr(Y::create( std::move( std::make_unique<Z>(Z()) ) )){} }; class Y { unique_ptr<Z> zptr; static shared_ptr<Y> create(unique_ptr<Z> zp) { if(!zp) return nullptr; else return shared_ptr<Y>(new Y(std::move(zp))); } Y(unique_ptr<Z> zp) : zptr(std::move(zp)){} }
3 Réponses :
Réponse courte: oui fort> p>
L'appel de la fonction std :: make_unique
std :: Déplacer () Code> Si vous la passe directement dans une autre fonction. P>
Ma question est, c'est le premier STD :: Déplacer () (autour de make_unique) nécessaire? P>
Si vous voulez dire cette ligne: p>
xxx pré> alors non, il est complètement inutile que
std :: make_unique
code> retourne temporaire qui est déjà prvalue code>. Vous pouvez faire quelque chose comme ceci: p>
xxx pré> au lieu de p>
xxx pré> mais tout ce
se déplace code > sont inutiles et le fait qu'il soit compilé montre clairement cela. p> blockQuote>
Oui! Le déplacement autour de Si vous attribuez un La valeur renvoyée par un appel d'expression ou de fonction, telle que le Notez qu'il existe des cas particuliers où vous faites et que vous n'avez pas besoin d'utiliser Si vous avez une variable nommée dont le type est une référence de valeur R, vous do em> besoin de En général, les variables avec des noms ne sont pas implicitement déplacées. P> li>
Si vous retournez une variable locale par valeur à partir d'une fonction, cet objet peut être déplacé automatiquement, dans le soi-disant Optimisation de la valeur de retour nommée . Cela donne une belle vitesse à revenir à la valeur. Vous n'avez pas besoin de penser beaucoup à ce sujet dans la pratique, soyez juste conscient que make_unique code> est inutile. P>
std :: Déplacer code> pour convertir une référence de valeur L
& code> (qui fait référence à un objet existant) dans une référence de valeur R. code> && code> (qui représente une valeur temporaire, ou quelque chose qui peut être déplacé de). p>
unique_ptr code> à une variable nommée, vous devez en effet
std :: Déplacer code> de celui-ci si vous souhaitez transférer sa propriété (généralement; voir ci-dessous ). Vous ne pouvez pas directement lier une référence de valeur R à une variable. P>
unique_ptr code> renvoyé par
make_shared code> est temporaire, et il peut donc naturellement se lier à une valeur r expression et être déplacé-de l'implicitement. p>
std :: Déplacer code>: p>
std :: Déplacer code> pour éviter de le transmettre par copie : p>
myClass (std :: string && s): m_mystring (s) {} code> copier strong> -Constructs
m_mystring code> p> p>
myClass (std :: string && s): m_mystring (std :: moue (s)) {} code> bouge-constructions
m_mystring code> p> p> p>
retour std :: Déplacer (quoi que ce soit); code> est presque toujours faux. P> Li>
ul>
Excellente explication. J'ai un suivi, puisque vous avez soulevé une situation similaire. Si la fonction que le make_unique est adoptée doit transmettre à un constructeur avant qu'il ne soit réellement utilisé, est le STD :: Déplacer () maintenant nécessaire, ou est-ce seulement nécessaire à l'intérieur du constructeur lui-même (la destination finale)?
@ M.parker de Scott Meyers ' Essential Moderne C ++ I> "Un paramètre est toujours un lvalue, même si son type est une référence de rvalue. C'est-à-dire que, donné, étant donné VOID F (widget && W); code>, le paramètre
w code> est un lvalue, même si son type est rvalue-référence-to-
widget code> ".
Cela pourrait sembler être un point mineur, mais la question était "est le premier STD :: Move () nécessaire i>", (pas "est le premier STD :: Déplacer () Un I> nécessaire). Donc, votre réponse est en fait "non!", pas "oui!". Je me suis déraillé pendant plusieurs minutes essayant de donner un sens à votre réponse, car j'ai vu votre "oui!" mais j'ai raté votre "ONU" mais et pensais que vous disiez le contraire de ce que vous dites réellement.
Quel est le problème avec l'utilisation de
std :: make_shared () code> si vous voulez réellement un
std :: partagé_ptr code>?
Tout ce que
std :: Déplacer code> fait l'objet à une prvalue. Si l'objet est déjà une pr devalue (par exemple, il n'a pas de nom ... c'est un temporaire), puis
std :: Déplacer code> est superflu.
@ πνντα-ῥεῖ Le code impliqué est une méthode d'usine qui attribue ses membres sur la création. L'objet renvoyé par elle est destiné à être le seul propriétaire de l'article géré par le fichier unique_ptr. Un Shared_Ptr travaillerait dans ce cas mais il trahit l'intention.
@ François-Andrieux et c'est, je vais ajusterai ce qui précède. :)