给定一个不可复制但可移动的类型,我试图构造一个这种类型的boost::ptr_vector
并从函数返回它。我正在使用Visual Studio 2013。
struct NonCopyableButMovable
{
using this_type = NonCopyableButMovable;
this_type() {}
this_type(this_type const &) = delete;
this_type & operator =(this_type const &) = delete;
this_type(this_type &&) {} // no default move ctr in VS2013
this_type & operator =(this_type &&) {} // no default move assignment in VS2013
};
boost::ptr_vector<NonCopyableButMovable> make_ptr_vector()
{
boost::ptr_vector<NonCopyableButMovable> res;
//return res; // (1)
//return std::move(res); // (2)
return boost::ptr_vector<NonCopyableButMovable>(); // (3)
}
我只能得到(3)编译:临时ptr_vector
被移动。使用(1)和(2),编译器调用boost::new_clone
,它试图调用NonCopyableButMovable
的复制构造函数。
根据this FAQ answer,“退出职能”一节,(1)应该有效,即res
应该移动,而不是复制。
根据this thread,(2)可以用作不完全符合标准的编译器的解决方法,但由于我不理解的原因,boost::new_clone
也被调用({1}} 2)。
请注意,如果我将boost::ptr_vector
替换为std::vector
,则返回编译的三种方法正常。
与VS2013一样,Boost ptr_containers的移动语义是否有问题?情况(2)会发生什么?实现这样一个ptr_container工厂函数的解决方法是什么?