簡體   English   中英

C ++ 11:在臨時對象上使用std :: move只能安全嗎?

[英]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>&& 盡管如此,我確信因為rawEntitiesfor循環之后超出了范圍,因此它的元素(字符串 - >字符串映射)將永遠不會再次使用。 所以我認為竊取(移動)其元素數據是安全的,因為它們不會再被使用。

當我運行程序時,它似乎工作。 但這是不好的做法/反模式,特別是,標准是否保證它是安全的?

反之。 在臨時對象上使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM