initializer_list-仅移动类型向量的初始化
在 C 中,当尝试使用移动元素列表初始化向量时-only 类型,例如 std::unique_ptr,编译器可能会错误地尝试复制元素而不是移动它们。可以使用各种技术来解决此问题:
中间包装器
为了避免复制,可以使用包装器类型来保存仅移动值作为引用。 rref_wrapper 类通过包装仅移动值并提供一个运算符来提取基础值来演示此方法。这允许将值移动到向量中而无需复制。
示例:
std::initializer_list<rref_wrapper<std::unique_ptr<int>>> il{ rref(std::make_unique<int>()), rref(std::make_unique<int>()), rref(std::make_unique<int>()) }; std::vector<std::unique_ptr<int>> v(il.begin(), il.end());
std::make_move_iterator
另一种方法涉及使用 std::make_move_iterator 创建迭代器,当取消引用,移动指向的元素。这消除了对包装类的需要。
示例:
std::unique_ptr<int> init[] = { std::make_unique<int>(), std::make_unique<int>(), std::make_unique<int>() }; std::vector<std::unique_ptr<int>> v{ std::make_move_iterator(std::begin(init)), std::make_move_iterator(std::end(init)) };
通过采用这些技术,可以列表初始化具有仅移动类型的向量,确保高效、正确的所有权转移。
以上是如何在 C 中正确列表初始化具有仅移动类型的向量?的详细内容。更多信息请关注PHP中文网其他相关文章!