为什么在C++中多了一个&来传递非静态成员函数的地址给线程?
Why is there an extra & to pass the address of a non-static member function to a thread in C++?
据我了解,函数名称本身就是指向它的指针。
因此,当我有一个函数时,我可以通过简单地将它的地址传递给线程构造函数来创建一个线程,如下所示:
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
为什么多了一个&
?如果确实需要,那为什么没有它编译器也不会报错?
As I understand, the name of a function itself serves as a pointer to it.
此行为继承自 C,仅适用于自由函数或静态成员函数。
对于 non-static 成员函数,没有到 pointer-to-member 的隐式转换。 pointer-to-member 与自由函数指针有根本的不同,因为它不能在不提供对象实例的情况下被调用。
If it is indeed needed, then how come the compiler does not complain even without it?
我猜您使用的是带有 non-standard 扩展名的编译器,以允许在这种情况下省略 &
。我相信旧版本的 MSVC 允许省略它;和 .
std::bind
对你有帮助。
ClassA instance;
std::thread threadObj2(std::bind(&ClassA::nonstatic_function, &instance));
据我了解,函数名称本身就是指向它的指针。
因此,当我有一个函数时,我可以通过简单地将它的地址传递给线程构造函数来创建一个线程,如下所示:
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
为什么多了一个&
?如果确实需要,那为什么没有它编译器也不会报错?
As I understand, the name of a function itself serves as a pointer to it.
此行为继承自 C,仅适用于自由函数或静态成员函数。
对于 non-static 成员函数,没有到 pointer-to-member 的隐式转换。 pointer-to-member 与自由函数指针有根本的不同,因为它不能在不提供对象实例的情况下被调用。
If it is indeed needed, then how come the compiler does not complain even without it?
我猜您使用的是带有 non-standard 扩展名的编译器,以允许在这种情况下省略 &
。我相信旧版本的 MSVC 允许省略它;和
std::bind
对你有帮助。
ClassA instance;
std::thread threadObj2(std::bind(&ClassA::nonstatic_function, &instance));