Преобразование std :: unique_ptr <Derived> в std :: unique_ptr <Base>

Допустим, у меня есть фабричные функции, работающие с базовыми и производными классами:

#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!
}

На последней строке выше мне нужноmove(d) чтобы заставить его работать, в противном случае я получаю «Ошибка: неверное преобразование изstd::unique_ptr<D> вstd::unique_ptr<D>&&«Моя интуиция сказала, что в этом контексте компилятор должен знать, что он может неявно сделатьd Rvalue и переместить его в базовый указатель, но это не так.

Это несоответствие в моих компиляторах (gcc 4.8.1 и VS2012)? Предполагаемый дизайнunique_ptr? Дефект в стандарте?

Ответы на вопрос(2)

Ваш ответ на вопрос