我目前正在阅读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++版本中不可用。