我想知道这件事。考虑一下:
etiquette
这是C ++ 11。它无法在GCC上使用长时间的错误消息进行编译,包括一个
etiquette
我可以做我想做的事情吗?我注意到使用shared_ptr,它可以正常工作。是否可以使用unique_ptr来做到这一点?如果是这样,我错过了什么?如果没有,为什么不呢?
答案 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)
};