Comment les paramètres unique_ptr doivent être gérés dans les constructeurs et les fonctions
Scénario
Considérez une classe Base se référençant comme suit :
class Base { public: typedef unique_ptr<Base> UPtr; Base() {} Base(Base::UPtr n) : next(std::move(n)) {} virtual ~Base() {} void setNext(Base::UPtr n) { next = std::move(n); } protected: Base::UPtr next; };
Méthodes pour transmettre les arguments unique_ptr
Pour utiliser efficacement les paramètres unique_ptr, envisagez les méthodes suivantes :
1. Par valeur (A)
Base(std::unique_ptr<Base> n) : next(std::move(n)) {}
Lorsqu'elle est appelée en tant que Base newBase(std::move(nextBase));, cette méthode transfère la propriété du pointeur vers la fonction. Après la construction, nextBase devient vide.
2. Par référence de valeur l non const (B)
Base(std::unique_ptr<Base> &n) : next(std::move(n)) {}
Cela nécessite une valeur l réelle (variable nommée) et permet à la fonction de revendiquer potentiellement la propriété du pointeur.
3. Par const l-value Reference (C)
Base(std::unique_ptr<Base> const &n);
Cela empêche la fonction de stocker le pointeur, mais garantit l'accès à l'objet pendant toute la durée de son exécution.
4. Par référence de valeur r (D)
Base(std::unique_ptr<Base> &&n) : next(std::move(n)) {}
Similaire à (B), mais nécessite l'utilisation de std::move lors du passage d'arguments non temporaires. La fonction peut ou non revendiquer la propriété.
Recommandations
Manipuler unique_ptr
Pour déplacer un unique_ptr, utilisez std::move. Cela évite la copie et garantit un transfert de propriété correct.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!