我正在尝试使用destroy中的自动连接属性创建一个线程向量。 Stroustrup建议使用guarded_thread:
struct guarded_thread : std::thread {
using std::thread::thread;
~guarded_thread() { if (joinable()) join(); }
};
这个guarded_thread就像魅力一样:
void f() { std::cerr << "f();" << std::endl; }
int main() { guarded_thread gt(f); }
但只要我不想在矢量中存储其中的几个:
void f() { std::cerr << "f();" << std::endl; }
int main() { std::vector<guarded_thread> v; v.emplace_back(f); }
实际上emplace_back()或push_back()会让编译器发出一条非常长的错误消息,抱怨std :: result_of中找不到“type”,但我不明白为什么std :: result_of会用guarded_thread实例化()作为模板参数。 Thread在我的STL实现上有一个模板构造函数:
template<typename _Callable, typename... _Args>
explicit
thread(_Callable&& __f, _Args&&... __args)
{
#ifdef GTHR_ACTIVE_PROXY
__asm ("" : : "r" (&pthread_create));
#endif
_M_start_thread(_M_make_routine(std::__bind_simple(
std::forward<_Callable>(__f),
std::forward<_Args>(__args)...)));
}
问题是:不知何故_Callable被替换为guarded_thread,但我不明白为什么。也许复制构造函数试图被调用?怎么可能修好?
我尝试了两种不同的编译器:
大概都抱怨同样的错误。
答案 0 :(得分:4)
似乎guarded_thread
缺少默认移动构造函数,应删除复制构造函数。
Here是一个有效的例子。
guarded_thread(const guarded_thread&) = delete ;
guarded_thread(guarded_thread&&) = default ;
注意:您的代码正在调用已删除的函数,即std::thread
复制构造函数,并且也没有提供移动构造函数。