Скажем, у меня есть функции factory, относящиеся к базовому и производному классам:
#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
? Дефект в стандарте?