-1

我正在尝试找出一种方法来从 c++ 中的 unordered_map 中获取线程。

但是,我得到std::thread::thread(const std::thread &) 试图引用已删除的函数

例子:

#include "stdafx.h"
#include <unordered_map>
#include <thread>

class ThreadContainer
{
    std::unordered_map<int, std::thread> map_;
public:
    void addThread(int handle, std::thread thread)
    {
        map_.emplace(std::move(handle), std::move(thread));
    }

    std::thread getThread(int handle)
    {
        return map_.at(handle);
    }
};

int main()
{
    ThreadContainer testing;

    return 0;
}

在这个代码示例中,我已经尝试过return map_.at(handle);return std::move(map_.at(handle);但这些似乎都不起作用。

如何从这个 unordered_map 中获取 std::thread ?

4

1 回答 1

2
std::thread getThread(int handle)

是一个按值返回的函数。这需要一个未删除的复制构造函数。正如您所注意到的,std::thread的复制构造函数已被删除。

解决方法:引用返回

std::thread & getThread(int handle)

并确保接收器也是参考。不要在链中的任何点强制复制。

如果通过“从这个 unordered_map 中获取 std::thread”,您想thread从中ThreadContainer删除

std::thread&& removethread(int handle)
{
    return std::move(map_.at(handle));
}

但这会在map_. 您可能想要删除密钥和现在未附加的thread.

std::thread&& removethread(int handle)
{
    std::thread temp(std::move(map_.at(handle)));
    map_.erase(handle);
    return std::move(temp);
}

另请注意,这ThreadContainer将不可复制,因为包含thread的 s 无法复制。delete ThreadContainer如果您的复制构造函数和赋值运算符,您将获得更易读的错误消息。

于 2018-02-27T23:13:20.540 回答