Ho appena scoperto std::shared_ptr
s' 'aliasing costruttore' e mi ritrovo a chiedere "perché non std :: unique_ptr hanno un corrispondente?Perché std :: unique_ptr non ha un costruttore aliasing come std :: shared_ptr ha?
Cioè, se si vuole assegnare un Foo
modo che si può passare il suo Bar
membro per una funzione che dovrebbe gestire tutto il ciclo di vita del Foo
, non sarebbe bello essere in grado di farlo?
#include <memory>
struct B {}
struct A {
B b;
}
void f(std::unique_ptr<B> b);
std::unique_ptr<A> a = std::make_unique<A>();
std::unique_ptr<B> b { std::move(a), &(a->b) }; // a now invalid.
f(std::move(b)); // f now responsible for deleting the A.
Questo funziona con std :: shared_ptr (http://ideone.com/pDK1bc)
#include <iostream>
#include <memory>
#include <string>
struct B {
std::string s;
};
struct A {
B b;
A(std::string s) : b{s} {};
~A() { std::cout << "A deleted." << std::endl; }
};
void f(std::shared_ptr<B> b) {
std::cout << "in f, b->s = " << b->s << " (use_count=" << b.use_count() << ")" << std::endl;
}
int main() {
std::shared_ptr<A> a = std::make_shared<A>("hello");
std::shared_ptr<B> b { a, &(a->b) };
a.reset(); // a now invalid.
std::cout << "before f, b->s = " << b->s << " (use_count=" << b.use_count() << ")" << std::endl;
f(std::move(b)); // f now responsible for deleting the A.
std::cout << "after f" << std::endl;
return 0;
}
uscite del previsto
before f, b->s = hello (use_count=1)
in f, b->s = hello (use_count=1)
A deleted.
after f
C'è una ragione logica per cui una cosa del genere non è stata inclusa? E/o, è una cattiva idea di emularlo con un unique_ptr<B>
con un deleter personalizzato che cancella il A
?
E quindi, dal momento che la parte deleter del tipo, non si integra bene con plain 'unique_ptr' a meno che non si digiti cancella il deleter, che è un ulteriore sovraccarico. –
@ T.C .: Anche se si digita cancella il deleter, non si integra bene con 'unique_ptr>'. Almeno, la conversione è possibile solo in una direzione. –
@ben in teoria in entrambe le direzioni, purché sia consentito il fallimento. – Yakk