从析构函数调用线程向量
Calling vector of threads from destructor
为什么我不能从析构函数中调用我的线程向量?使用析构函数有什么规则吗?
void p ()
{
std::cout << "thread running " << std::endl;
}
class VecThreads // Error: In instantiation of member function 'std::__1::vector<std::__1::thread, std::__1::allocator<std::__1::thread> >::vector' requested here
{
public:
std::vector<std::thread> threads;
VecThreads() {
threads.push_back(std::thread(p));
}
~VecThreads()
{
threads[0].join();
}
};
int main(int argc, const char * argv[]) {
VecThreads h = VecThreads();
//h.threads[0].join(); // delete deconstructor and use this works fine
return 0;
}
我得到的错误:
Calling a private constructor of class 'std::__1::thread'
问题出在:
VecThreads h = VecThreads();
VecThreads
没有移动构造函数,它的生成被禁用(即,未声明)因为它有一个 用户定义的析构函数。因此,上面的语句调用了VecThreads
的拷贝构造函数。
VecThreads
包含一个类型为 std::vector<std::thread>
的数据成员——这是不可复制的,因为 std::thread
对象是不可复制的。尽管 std::vector<std::thread>
不可复制,但它是可移动的,因此移动构造函数原则上可以解决问题。您可以通过在 VecThreads
的定义中添加以下内容来显式启用移动构造函数的生成:
VecThreads(VecThreads&&) = default;
由于强制复制省略。
,您的原始代码自 C++17 起无需修改即可编译
为什么我不能从析构函数中调用我的线程向量?使用析构函数有什么规则吗?
void p ()
{
std::cout << "thread running " << std::endl;
}
class VecThreads // Error: In instantiation of member function 'std::__1::vector<std::__1::thread, std::__1::allocator<std::__1::thread> >::vector' requested here
{
public:
std::vector<std::thread> threads;
VecThreads() {
threads.push_back(std::thread(p));
}
~VecThreads()
{
threads[0].join();
}
};
int main(int argc, const char * argv[]) {
VecThreads h = VecThreads();
//h.threads[0].join(); // delete deconstructor and use this works fine
return 0;
}
我得到的错误:
Calling a private constructor of class 'std::__1::thread'
问题出在:
VecThreads h = VecThreads();
VecThreads
没有移动构造函数,它的生成被禁用(即,未声明)因为它有一个 用户定义的析构函数。因此,上面的语句调用了VecThreads
的拷贝构造函数。
VecThreads
包含一个类型为 std::vector<std::thread>
的数据成员——这是不可复制的,因为 std::thread
对象是不可复制的。尽管 std::vector<std::thread>
不可复制,但它是可移动的,因此移动构造函数原则上可以解决问题。您可以通过在 VecThreads
的定义中添加以下内容来显式启用移动构造函数的生成:
VecThreads(VecThreads&&) = default;
由于强制复制省略。
,您的原始代码自 C++17 起无需修改即可编译