[英]C++11: Is using std::move only safe on temporary objects?
在我的代碼中,我有這樣的事情:
unordered_multimap<string, unordered_map<string, string> > mEntities;
...
vector<unordered_map<string, string> > rawEntities;
if (qi::phrase_parse(&buf[0], (&buf[0]) + buf.size(), EntityParser<char*>(), qi::space, rawEntities)) {
for (auto &propGroup : rawEntities) {
auto search = propGroup.find("classname");
if (search != propGroup.end()) {
// is stealing propGroup safe???
mEntities.emplace(search->second, std::move(propGroup));
}
}
}
// rawEntities goes out of scope here
正如你所看到的,我正在使用std::move
對類型的對象推導出unordered_map<string, string>&
,這顯然不是unordered_map<string, string>&&
。 盡管如此,我確信因為rawEntities
在for
循環之后超出了范圍,因此它的元素(字符串 - >字符串映射)將永遠不會再次使用。 所以我認為竊取(移動)其元素數據是安全的,因為它們不會再被使用。
當我運行程序時,它似乎工作。 但這是不好的做法/反模式,特別是,標准是否保證它是安全的?
反之。 在臨時對象上使用std::move
是沒有意義的。 它們已經是R值,並且在傳遞給函數時將被推導為R值引用。 std::move
是將L值轉換為R值引用,以便可以移動它們。
所以我認為竊取(移動)其元素數據是安全的,因為它們不會再被使用。
是的,這是正確的。
通常, 臨時對象是未命名的,並且已經是rvalues 。 std::move
不是真的適用,因為它是未命名的。
什么時候std::move
適用? 每當對象即將到期並且不再需要時。 這就是std::move
所做的,它會轉換值類別,以便可以從中移動。
這是一個有趣的用例 - 竊取容器的(過濾的)內容,而不僅僅是整個容器。
鑒於在for
循環完成后不會需要vector
的內容, 那么是的,它將按預期工作 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.