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);
}
3 Réponses :
std::unique_ptr<int> ptr2(std::move(ptr));
Bien sûr, ce n'est qu'une bonne idée si l'OP veut réellement Déplacer i> 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 code> doit être utilisé à la place de
std :: unique_ptr code> et conservez la copie.
Dans votre exemple, la deuxième fois (en std :: unique_ptr
PTR code> est utilisé. P>
principal code>),
std :: unique_ptr
PTR code> est Un lvalue, et ne peut pas être déplacé directement (vous pouvez utiliser
std :: déplacer code>). p>
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!!!
Je ne peux pas accepter deux réponses. J'ai choisi celui de Nelxiost, car il est plus succinct