将一对移动到矢量中

Jon*_*ele 2 c++ move c++11 std-pair

我有这个功能模板:

template<typename Collection, typename T>
void insertColElement(Collection col, const T& element, std::true_type)
{
    col.insert(col.end(), std::move(element));
}
Run Code Online (Sandbox Code Playgroud)

如果T是可移动构造的,则调用它.现在我想用Collection = std::vector<..>和T = 调用这个函数std::pair<std::unique_ptr<..>, bool>,但编译器抱怨unique_ptr和pair的删除拷贝构造函数.我已经尝试使用emplace并单独移动第一个和第二个,但编译器仍然想调用复制构造函数.

编辑:

以下是所有相关的代码段:

template<typename Collection, typename T>
void insertColElement(Collection col, T&& element, std::true_type)
{
    col.insert(col.end(), std::forward<T>(element));
}



template<typename Collection, typename T>
void insertColElement(Collection col, T& element, std::false_type)
{
    static_assert(std::is_copy_constructible<T>::value,
        "Serialization: Collection type is neither copy nor move constructable");

    col.insert(col.end(), element);
}


template<typename Archive, typename Collection>
inline void loadCollection(Archive& ar, Collection& col)
{
    int size;
    ar >> size;

    for(int i = 0; i < size; i++) {
        typename Collection::value_type element;
        ar >> element;

        insertColElement(col, std::move(element), 
            typename std::is_move_constructible<typename Collection::value_type>::type());
    }
}
Run Code Online (Sandbox Code Playgroud)

这些函数是我工作的小型序列化模块的一部分.loadCollection用于从Archiv加载容器.导致问题的调用如下所示:

IStreamArchive a(filestream);
std::vector<std::pair<std::unique_ptr<Scope>, bool>> vec;
a << vec;
Run Code Online (Sandbox Code Playgroud)

Bar*_*rry 10

你不能移动 - 来自const的东西,所以你最终得到了复制构造函数,即使你写了move()(因为move只是一个演员,你把元素转换为a const T&&.没有const T&&构造函数,T&&构造函数不匹配,所以下一个最好的匹配是const T&构造函数).那就是问题所在.

您应该写下以下内容:

template<typename Collection, typename T>
void insertColElement(Collection& col, T&& element, std::true_type)
{
    col.insert(col.end(), std::forward<T>(element));
}
Run Code Online (Sandbox Code Playgroud)