std::move() 分配了一个堆栈 unordered_map?

std::move() a stack allocated unordered_map?

我只是想知道创建一个本地任务 unordered_map 是否明智,我稍后会像这样移动到全局 space:

void StatesRegister(std::vector<global_states_t>states)
{
    // create temporary notify map
    local_map tmp_map;

    // fill map...

    // move to global task map
    TaskHandle_t handle = (void*)0x50;

    // MUTEX
    // emplace to global map
    task_map.emplace(handle, std::move(tmp_map));
    // /MUTEX
}

问题是我是否可以在这里使用 std::move...Afaik unordered_map 是一个 RAII 对象,因此当对象“托管”在任务堆栈上时,存储桶是保留在堆上。所以我希望 std::unordered_map 的 move-constructor 能够理解我正在尝试做的事情并将桶传递给堆上新创建的实例,但是会吗?

您的期望和代码都很好 - 您可以从局部变量 (tmp_map) move-assign 到程序中其他地方的变量。更一般地说,unordered_map 不仅仅是“桶”——桶通常包含迭代器以转发每个存储元素的列表节点。无论如何,所有现有元素的所有权以及与之相关的 buckets/nodes 都将转移到 move-assigned-to 变量。您当然应该确保访问 move-assigned-to 变量的任何其他线程都以类似方式锁定互斥量。