例如,如果我有一个std::list,并且使用std::move()将它的信息移动到一个std::map中,那么通过填充更多的数据来重用列表是否安全,这样我就可以向地图中添加更多的条目了吗?我隐约记得另一位程序员告诉我,std::move()将事物放置在一个未知的状态,因此您不应该在后面重用它们,但我只想确认一下,因为我似乎无法通过搜索就找到关于它的任何信息。
如果不安全,那么在移动列表后调用clear()是否可以重用?
下面是我所做工作的一个例子:
// 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,所以我在如何初始化复杂的数据结构方面受到了一些限制。
发布于 2015-01-29 01:11:37
从标准C++库类移出后,它们处于未指定的状态,但在其他方面完全可用。相关截面为17.6.5.15 lib.types.movedfrom。
C++标准库中定义的类型对象可以从(12.8)中移出。移动操作可以显式指定或隐式生成。除非另有规定,否则移出的物体应置于有效但未指定的状态。
据我所知,没有一个容器指定不同的内容。
但是,从它的声音来看,你实际上是在移动元素。但是,对于这些限制,基于MoveConstructible和MoveAssignable含义的定义(来自17.6.3.1 utility.arg.requirements;rv是移动构造或移动赋值的论点),适用了相当类似的限制:
rv的状态是未指定的,注意:rv仍然必须满足正在使用它的库组件的要求。这些需求中列出的操作必须按照指定的方式工作,无论是否从rv中移出。-end注记
https://stackoverflow.com/questions/28205387
复制相似问题