可以在构造函数初始值设定项列表中使用标准::线程



我目前正在阅读C++并发行动手册。我似乎无法编译以下代码。我一直遇到错误

error: field of type 'std::thread' has private copy constructor

是否调用了 std::thread 的复制构造函数?

class scoped_thread
{
    std::thread t;
public:
    explicit scoped_thread(std::thread t_):
        t(std::move(t_))
    {
        if(!t.joinable())
            throw std::logic_error("No thread");
    }
    ~scoped_thread()
    {
        t.join();
    }
    scoped_thread(scoped_thread const&)=delete;
    scoped_thread& operator=(scoped_thread const&)=delete;
};
int main() {
    int some_local_state = 0;
    scoped_thread t(std::thread(func(some_local_state)));
}

是否调用了 std::thread 的复制构造函数?

这完全取决于使用scoped_thread的代码。

请注意,std::thread是可移动但不可复制的类型。

这意味着,下一个代码可以正常工作:

scoped_thread st(std::thread{});

因为t_是通过移动构造函数创建的。

但是,如果您创建一个std::thread实例,然后尝试将其包装到scoped_thread中,如下所示:

std::thread t;
scoped_thread st(t);

然后尝试调用复制构造函数,并且出现编译错误。

由于scoped_thread似乎实现了 RAII,因此使用它的正确方法是包装一个未命名的std::thread实例,如答案的第一个示例所示。

列出的

代码是正确的。但是,-std未设置为编译器的c++11这可能使编译器使用复制构造函数,因为移动语义在旧C++版本中不可用。

最新更新