首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在std::move之后重用std容器安全吗?

在std::move之后重用std容器安全吗?
EN

Stack Overflow用户
提问于 2015-01-29 01:08:02
回答 1查看 2.2K关注 0票数 2

例如,如果我有一个std::list,并且使用std::move()将它的信息移动到一个std::map中,那么通过填充更多的数据来重用列表是否安全,这样我就可以向地图中添加更多的条目了吗?我隐约记得另一位程序员告诉我,std::move()将事物放置在一个未知的状态,因此您不应该在后面重用它们,但我只想确认一下,因为我似乎无法通过搜索就找到关于它的任何信息。

如果不安全,那么在移动列表后调用clear()是否可以重用?

下面是我所做工作的一个例子:

代码语言:javascript
复制
// Create the initial list, give it some data, then move it into the map.
typedef std::list<std::pair<string, uint16>> TListType;
TListType data;
data.push_back(std::make_pair("some string", 0));
data.push_back(std::make_pair("some other string", 0));

std::map<uint32, TListType> mappedData;
mappedData.insert(std::make_pair(0, std::move(data)));

// Insert more data into the list, then move into the map as a new entry.
data.push_back(std::make_pair("new strings", 9));
mappedData.insert(std::make_pair(1, std::move(data)));

我之所以要做这么糟糕的事情,是因为我不能使用初始化程序列表,也没有Boost,所以我在如何初始化复杂的数据结构方面受到了一些限制。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-29 01:11:37

从标准C++库类移出后,它们处于未指定的状态,但在其他方面完全可用。相关截面为17.6.5.15 lib.types.movedfrom。

C++标准库中定义的类型对象可以从(12.8)中移出。移动操作可以显式指定或隐式生成。除非另有规定,否则移出的物体应置于有效但未指定的状态。

据我所知,没有一个容器指定不同的内容。

但是,从它的声音来看,你实际上是在移动元素。但是,对于这些限制,基于MoveConstructibleMoveAssignable含义的定义(来自17.6.3.1 utility.arg.requirements;rv是移动构造或移动赋值的论点),适用了相当类似的限制:

rv的状态是未指定的,注意:rv仍然必须满足正在使用它的库组件的要求。这些需求中列出的操作必须按照指定的方式工作,无论是否从rv中移出。-end注记

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28205387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档