c++11线程,静态或非静态类成员函数,参数的含义

c++11 thread, static or non-static class member function, meaning of arguments

本文关键字:参数 函数 成员 静态类 线程 静态 c++11      更新时间:2023-10-16

我一直在玩c++11线程一段时间,并有一些问题。人们说,当你在线程中调用一个类成员函数时,这个函数必须是static。但事实似乎并非如此。例如,我发现如下:

class bar
{ public:
void foo() {std::out << "Hello" << std::endl};
}
int main()
{
std::thread t0(&bar::foo, bar());
t0.join();
}

上面的代码运行良好。在c++11标准中,成员函数似乎不必是静态的。我想知道我的理解是否正确。另一个问题是,如果我简单地修改"void foo()"与"静态void foo()",我得到一个错误:

error: no type named 'type' in 'class std::result_of<void (*(bar))()>'

我不明白这一点,但似乎这是因为我调用线程的方式不正确。在线程中调用函数时我很困惑。例如,我找到了另一种方法来调用上面示例中的相同成员函数

int main()
{ bar A;
std::thread t0(&bar::foo, &A);
}

它也工作!我不知道这两种方式的区别。似乎在第一种方式中,类的构造函数将在每次调用foo()时执行,而在第二种方式中则不会。这是真的吗?此外,当在另一个类成员函数中调用成员函数时,必须传递'this'。

我上网搜索,我能找到的都是例子,没有解释论点的意义。谁能告诉我如何在std::thread中设置参数(特别是前三个)?

std::thread t0(&bar::foo)在静态foo方法中工作得很好。

另外,当问一个问题时,考虑提供工作代码而不是你的文本你刚才在本网站的文本字段中实际写的内容。

简短的回答你的问题:提供this参数非静态类方法或不提供它,如果它是静态类方法。

但是,如果你连这个都不明白,你必须知道一件事:每个类方法与this对象一起工作,这意味着指向当前对象的常量指针。当绑定函数时(我猜确切的绑定工作在std::thread内),第一个参数必须是您想要调用的方法的对象。否则它就没有意义了:那么你是在尝试用什么对象做某事呢?this隐式地存在于类的每个非静态方法中,通过方法的第一个参数。

我建议你阅读权威的c++ stackoverflow图书指南和列表