据我了解,函数的名称本身就是指向它的指针。
因此,当我有一个函数时,我可以通过简单地将其地址传递给线程构造函数来创建线程,如下所示:
void thread_function {
}
std::thread threadObj1(thread_function);
我的困惑是在将非静态成员函数的地址传递给线程时。例如:
class ClassA
{
public:
void nonstatic_function()
{
}
};
ClassA instance;
std::thread threadObj2(ClassA::nonstatic_function, &instance);
传递此类函数的地址有两种方式:
ClassA::nonstatic_function
&ClassA::nonstatic_function
为什么会有额外的&
?如果确实需要它,那么即使没有它,编译器为什么也不会抱怨呢?
据我了解,函数的名称本身就是指向它的指针。
此行为继承自 C,仅适用于自由函数或静态成员函数。
对于非静态成员函数,没有隐式转换为指向成员的指针。指向成员的指针与自由函数指针有着根本的不同,因为如果不同时提供对象实例,就无法调用它。
如果确实需要它,那么即使没有它,编译器为什么也不会抱怨呢?
我猜您正在使用具有非标准扩展名的编译器,以允许在这种情况下省略&
。我相信旧版本的 MSVC 允许省略它;gcc/Windows 默认允许这样做以实现 MSVC 兼容性。
>std::bind
帮助你。
ClassA instance;
std::thread threadObj2(std::bind(&ClassA::nonstatic_function, &instance));