我有一個字串對的無序映射,我通過訊息 id(鍵)參考它。現在我想使用函式接收的臨時字串物件來構建字串對,從而重用已經為堆上的字串分配的記憶體。但是我很難理解這個結構。這是我想出的:
std::unordered_map<int, std::pair<std::string, std::string>> data_map;
void foo(int msg_id, std::string&& topic, std::string&& data)
{
data_map.emplace(std::piecewise_construct, std::forward_as_tuple(msg_id), std::forward_as_tuple(std::piecewise_construct, std::forward_as_tuple(topic), std::forward_as_tuple(data)));
}
我的推理是,我需要為包含鍵和值的映射構造第一對,其值必須由另一個分段對建構式創建,我將 r 值參考提供給該建構式。它可以編譯,但我的直覺告訴我有些不對勁。我可以像這樣重用分配的字串堆記憶體嗎?
uj5u.com熱心網友回復:
您的構造沒有使用移動建構式來構造新字串,因此它沒有重用分配。
變數的名稱始終是左值。因此std::forward_as_tuple將轉發topic并data作為左值參考,導致使用字串的復制建構式。
要傳遞右值,您需要std::move. 此外,由于std::pair有一個建構式,它為兩個對元素接受兩個引數,這正是你已經擁有的兩個字串,你不需要第二個分段構造:
data_map.emplace(std::piecewise_construct, std::forward_as_tuple(msg_id), std::forward_as_tuple(std::move(topic), std::move(data)));
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/426968.html
下一篇:以日期時間格式轉換字串
