你能用初始化列表中的unique_ptr初始化一个STL容器吗?

时间:2016-07-18 00:23:21

标签: c++11 stl unique-ptr

我想知道这件事。考虑一下:

etiquette

这是C ++ 11。它无法在GCC上使用长时间的错误消息进行编译,包括一个

etiquette

我可以做我想做的事情吗?我注意到使用shared_ptr,它可以正常工作。是否可以使用unique_ptr来做到这一点?如果是这样,我错过了什么?如果没有,为什么不呢?

2 个答案:

答案 0 :(得分:4)

没有

无法修改initializer_list的元素。

unique_ptr无法移动(因为它是常量)并且无法复制(因为它只是一种移动类型),因此您需要进行软管移动

答案 1 :(得分:1)

当然,没问题。

首先是一个智能的unique_ptr代理,因此我们可以在const上下文中创建和移动它们:

template<class T>
struct il_up {
  mutable std::unique_ptr<T> ptr;
  template<class U,
    std::enable_if_t< std::is_convertible<U*, T*>{}, int>* =nullptr
  >
  il_up( std::unique_ptr<U> o ): ptr(std::move(o)) {}

  operator std::unique_ptr<T>() const {
    return std::move(ptr);
  }
};

然后我们想将它存储在initializer_list中。即使它是const,它也可以传递unique_ptr

然后是一个容器制作代理来存储临时初始化列表:

template<class T>
struct make_container {
  std::initializer_list<T> il;
  make_container( std::initializer_list<T> const& l ):il(l) {} // const& here matters

  template<class C>
  operator C()&&{
    return {il.begin(), il.end()};
  }
};

我们完成了:

std::vector<std::unique_ptr<int>> vec = make_container<il_up<int>>{
  std::make_unique<int>(1), std::make_unique<int>(2),
  std::make_unique<int>(3), std::make_unique<int>(4)
};

live example