使用C++11,假设我有处理基类和派生类的工厂函数:
#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)
才能使其工作,否则会出现"Error: invalid conversion from std::unique_ptr<D>
to std::unique_ptr<D>&&
." 我的直觉认为,在这种情况下,编译器应该知道它可以隐式地将d
转换为rvalue并将其移动到基指针中,但它没有这样做。
这是我的编译器(gcc 4.8.1和VS2012)不符合标准吗?还是unique_ptr
的预期设计?标准中的缺陷?
更新:C++14修复了这个问题。新的编译器,如GCC 9,即使使用-std=c++11
,也接受原始代码。