Il seguente codice compila con clangore 3.0/libC++:std :: make_shared, std :: unique_ptr e spostare costruttori
#include <memory>
class Foo
{
public:
Foo()
: mem_(new int(10))
{
}
std::unique_ptr<int> mem_;
};
int main()
{
auto foo = std::make_shared<Foo>();
return 0;
}
Ma questo non (std::string
parametro aggiunta):
#include <memory>
#include <string>
class Foo
{
public:
Foo(const std::string& s)
: mem_(new int(10))
{
}
std::unique_ptr<int> mem_;
};
int main()
{
auto foo = std::make_shared<Foo>("aaa");
return 0;
}
Clang lamenta l'utilizzo di un costruttore eliminato. Per me, questo non ha senso, dal momento che std::make_shared
non dovrebbe copiare l'istanza Foo, l'unica cosa che farebbe scattare la chiamata al (cancellato) costruttore di copia di std::unique_ptr
.
Ma ecco, non appena mi definisco un costruttore mossa in modo esplicito, si compila.
#include <memory>
#include <string>
class Foo
{
public:
Foo(const std::string& s)
: mem_(new int(10))
{
}
Foo(Foo&& other)
: mem_(std::move(other.mem_))
{
}
std::unique_ptr<int> mem_;
};
int main()
{
auto foo = std::make_shared<Foo>("aaa");
return 0;
}
Ora, le domande:
- Perché si compilare nel primo esempio, ma non la seconda?
- Può
std::make_shared
copia/spostare l'oggetto, mentre la costruzione è? - Perché l'aggiunta di un costruttore mossa risolvere il problema? Non ricordo che l'aggiunta di un costruttore non predefinito dovrebbe sopprimere un costruttore di mosse implicito.
EDIT: Controllato e tutti gli esempi sembrano per compilare bene con gcc 4.5.1 (via ideone.com), ho il sospetto che sia il caso di un bug clang/libC++, ma le domande 2 e 3 ancora in piedi, in più vorrei sapere quale compilatore è più "corretto".
Io non credo che ci sia mai una mossa costruttore implicita fornita –
@parapura Rajkumar (1) rimozione di unique_ptr fa andare via (anche con non predefinita ctor), (2) il costruttore di movimenti impliciti è ancora definito secondo l'ultimo testo: http: //mmocny.wordpress.com/2010/12/09/implicita-move-wont-go/ –
@parapurarajkumar: discussioni in effetti, mi ricordo di aver letto in cui i costruttori si muovono impliciti erano una brutta cosa, e deve essere rimosso dallo standard. Tuttavia, non conosco la fine della storia. –