我有一个字符串对的无序映射,我通过消息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值refs提供给该构造函数。它编译了,但我的直觉告诉我有些问题。我能像这样重用字符串的已分配堆内存吗?
您的构造没有使用move构造函数来构造新字符串,因此它没有重用分配。
变量的名称总是左值。因此,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)));