Преобразование 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
? Дефект в стандарте?