Convertir std :: unique_ptr <Derived> a std :: unique_ptr <Base>
Digamos que tengo funciones de fábrica que tratan con clases base y derivadas:
#include <memory>
using namespace std;
struct B { virtual ~B() {} };
struct D : B {};
unique_ptr<B> MakeB()
{
auto b = unique_ptr<B>( new B() );
return b; // Ok!
}
unique_ptr<B> MakeD()
{
auto d = unique_ptr<D>( new D() );
return d; // Doh!
}
En la última línea de arriba, necesitomove(d)
para que funcione, de lo contrario me aparece "Error: conversión no válida destd::unique_ptr<D>
astd::unique_ptr<D>&&
"Mi intuición dijo que en este contexto, el compilador debería saber que podría hacer implícitamented
un valor r y muévelo al puntero base, pero no lo hace.
¿Es esto una falta de conformidad en mis compiladores (gcc 4.8.1 y VS2012)? El diseño previsto deunique_ptr
? ¿Un defecto en el estándar?