首页 >后端开发 >C++ >如何在 C 中用仅移动类型初始化向量?

如何在 C 中用仅移动类型初始化向量?

Patricia Arquette
Patricia Arquette原创
2024-12-23 21:31:11993浏览

How to Initialize a Vector with Move-Only Types in C  ?

仅移动类型的 Vector 初始化

G 尝试在向量初始化中复制 unique_ptr 对象,由于复制构造函数而失败无法访问。该错误消息正确突出了尝试复制不可复制对象的问题。

利用移动迭代器

要解决此问题,您可以利用移动迭代器,它会移动取消引用时的元素:

using move_only = std::unique_ptr<int>;
move_only init[] = { move_only(), move_only(), move_only() };
std::vector<move_only> v{std::make_move_iterator(std::begin(init)),
                          std::make_move_iterator(std::end(init))};

雇用助手类型

或者,您可以利用辅助类型在初始化中实现移动语义:

template<class T>
struct rref_wrapper
{
    explicit rref_wrapper(T&& v) : _val(std::move(v)) {}
    explicit operator T() const { return T{std::move(_val)}; }
    T&& _val;
};

// Only usable on temporaries
template<class T>
typename std::enable_if<
    !std::is_lvalue_reference<T>::value,
    rref_wrapper<T>
>::type rref(T&& v) {
    return rref_wrapper<T>(std::move(v));
}

std::initializer_list<rref_wrapper<move_only>> il{rref(move_only()),
                                                    rref(move_only()),
                                                    rref(move_only())};
std::vector<move_only> v(il.begin(), il.end());

以上是如何在 C 中用仅移动类型初始化向量?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn