【发布时间】:2017-06-06 13:43:55
【问题描述】:
我一直在阅读 this answer 关于使用 std::make_move_iterator 将元素从 std::vector<std::unique_ptr<T>> 移动到另一个的内容。它完美无瑕:
std::vector<std::unique_ptr<int>> c1;
std::vector<std::unique_ptr<int>> c2;
c1.push_back(std::unique_ptr<int>(new int));
c2.insert(c2.end(), std::make_move_iterator(c1.begin()), std::make_move_iterator(c1.end()));
现在我尝试将其更改为使用不同的容器 (std::list):
std::list<std::unique_ptr<int>> c1;
std::list<std::unique_ptr<int>> c2;
c1.push_back(std::unique_ptr<int>(new int));
c2.insert(c2.end(), std::make_move_iterator(c1.begin()), std::make_move_iterator(c1.end()));
但编译失败:
错误 C2248:“std::unique_ptr<_ty>::unique_ptr”:无法访问在类“std::unique_ptr<_ty>”中声明的私有成员
但是,如果列表包含其他对象(如 std::string),它确实有效:
std::list<std::string> s1;
std::list<std::string> s2;
s2.insert(s2.end(), std::make_move_iterator(s1.begin()), std::make_move_iterator(s1.end()));
现在,如果我在同一个问题中使用another answer,它使用std::back_inserter 和std::move,那么它同时适用于std::vector 和std::list:
std::list<std::unique_ptr<int>> c1;
std::list<std::unique_ptr<int>> c2;
c1.push_back(std::unique_ptr<int>(new int));
std::move(c1.begin(), c1.end(), std::back_inserter(c2));
据我了解,这个解决方案基本上是在将每个项目重新插入第二个容器时单独移动。
我的问题是,为什么在std::unique_ptr 的std::list 上使用std::make_move_iterator 不起作用,但它对std::vector 起作用,或者如果列表元素属于不同类型?
注意:我使用的是 Visual Studio 2010。
【问题讨论】:
-
VS2010 很古老。 Works for me 与 VS2017。
-
有趣...谢谢!
-
我想知道它是否有任何解决方法?如问题中所述,我有另一个解决方案,但我暂时无法从 VS 2010 迁移
-
要在列表之间移动,您可能应该使用
splice。 -
不错的推荐,谢谢!正如你所说,它实际上更直接和自我记录
标签: c++11 linked-list insert move-semantics unique-ptr