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?

Respuestas a la pregunta(2)

Su respuesta a la pregunta