9
votes

unique_ptr dans la liste d'initialisation des membres

EDIT: STRUT> Je comprends unique_ptr est non-copieux et ne peut être déplacé que. Je ne comprends pas ce qui se passe avec la liste d'initialisation.

Pourquoi la liste d'initialisation des membres peut fonctionner comme dans le code snipt? p>

#include <memory>

class MyObject
{
public:
    MyObject() : ptr(new int) // this works.
    MyObject() : ptr(std::unique_ptr<int>(new int)) 
    // i found this in many examples. but why this also work? 
    // i think this is using copy constructor as the bottom.        
    {
    }

    MyObject(MyObject&& other) : ptr(std::move(other.ptr))
    {
    }

    MyObject& operator=(MyObject&& other)
    {
        ptr = std::move(other.ptr);
        return *this;
    }

private:
    std::unique_ptr<int> ptr;
};

int main() {
    MyObject o;
    std::unique_ptr<int> ptr (new int);
    // compile error, of course, since copy constructor is not allowed. 
    // but what is happening with member initialization list in above?
    std::unique_ptr<int> ptr2(ptr); 
}


0 commentaires

3 Réponses :


1
votes
std::unique_ptr<int> ptr2(std::move(ptr));

2 commentaires

Bien sûr, ce n'est qu'une bonne idée si l'OP veut réellement Déplacer le pointeur plutôt que, disons, avoir deux pointeurs intelligents à l'objet où le bon correctif est très différent.


@Hurkyl: En effet, si OP veut partager la propriété, std :: partagé_ptr doit être utilisé à la place de std :: unique_ptr et conservez la copie.



12
votes

Dans votre exemple, std :: unique_ptr (nouveau int) est une rvalue, donc le constructeur de déplacement de PTR est utilisé.

la deuxième fois (en principal ), std :: unique_ptr pTR2 (PTR) ne fonctionne pas car PTR est Un lvalue, et ne peut pas être déplacé directement (vous pouvez utiliser std :: déplacer ).


0 commentaires

11
votes

Ceci est à faire avec nommé em> et non nominés em> objets.

Lorsque vous faites ceci: P>

MyObject() : ptr(std::unique_ptr<int>(new int)) 
                                     ^--- look no name!!!


1 commentaires

Je ne peux pas accepter deux réponses. J'ai choisi celui de Nelxiost, car il est plus succinct