移动boost :: ptr_vector

时间:2017-05-23 08:51:04

标签: c++ c++11 visual-studio-2013 move-semantics boost-ptr-container

给定一个不可复制但可移动的类型,我试图构造一个这种类型的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工厂函数的解决方法是什么?

0 个答案:

没有答案