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

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

DDD
发布: 2024-12-17 16:06:11
原创
840 人浏览过

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

仅移动类型的向量初始化

考虑以下代码,其目的是使用 std::unique_ptr 实例初始化向量:

#include <vector>
#include <memory>

int main() {
  using move_only = std::unique_ptr<int>;
  std::vector<move_only> v{move_only(), move_only(), move_only()};
}
登录后复制

但是,这段代码在GCC中编译时会触发错误4.7,由于 std::unique_ptr 不支持复制,编译器会在初始化期间尝试创建指针的副本。

GCC 的行为

GCC 尝试复制在当前的 C 标准下,指针可以被认为是正确的,该标准没有明确解决仅移动类型的列表初始化场景,例如unique_ptr.

替代初始化方法

要正确初始化仅移动类型的向量,可以采用以下方法:

使用迭代器:

这种方法涉及为初始化列表并将其传递给向量的构造函数:

#include <iterator>
#include <vector>
#include <memory>

int main() {
  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))};
}
登录后复制

使用 rref_wrapper:

此技术采用为移动引用提供临时存储的辅助类型:

#include <utility>
#include <type_traits>

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

private:
  T&& _val;
};

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));
}

template<class T>
void rref(T&) = delete;

int main() {
  using move_only = std::unique_ptr<int>;
  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中文网其他相关文章!

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