首页 > 后端开发 > C++ > 如何在 C 中正确列表初始化具有仅移动类型的向量?

如何在 C 中正确列表初始化具有仅移动类型的向量?

Barbara Streisand
发布: 2025-01-01 07:20:10
原创
664 人浏览过

How to Correctly List-Initialize Vectors with Move-Only Types in C  ?

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板