为什么在CTOR中使用线程“非标准语法;使用'&'创建指向成员的指针”?

时间:2019-10-22 13:19:56

标签: c++ multithreading exception visual-c++

代码如下:

#include <iostream>
#include <thread>

struct PickRandomFile {
    PickRandomFile() {
        std::thread t1(taskScanPaths);
    }

    inline void taskScanPaths() {
        // my task
    }
};

int main() {
    PickRandomFile pickRandomFile;

    return 0;
}

msvc PickRandomFile :: taskScanPaths':非标准语法;使用“&”创建指向成员ThreadTrigger的指针

怎么了?我通常是在gcc中完成的。

1 个答案:

答案 0 :(得分:3)

自由函数“衰减到指针”(类似于数组),所以

std::thread t1(taskScanPaths);

如果taskScanPaths是一个自由函数,那会没事的,它的作用与

相同
std::thread t1(&taskScanPaths);

但是,对于类成员函数,您需要使用地址来获取指向成员函数的指针(并且需要指定类),如

std::thread t1(&PickRandomFile::taskScanPaths,this);

还请注意,您需要将对象/指针传递给实例,以便线程可以实际调用该方法。

来自cppreference的一些相关引号:

  

指向成员函数的指针

     

指向非静态成员函数f的指针,该成员函数f是类C的成员   可以完全使用表达式&C :: f进行初始化。这样的表达   因为C的成员函数中的&&(C :: f)或&f不构成指向的指针   成员函数

它没有明确提及f,但是由于&f没有形成指向成员函数的指针,因此可以肯定地假设f也没有形成指向成员函数的指针

另一方面:

  

功能指针

     

指向函数的指针可以用a的地址初始化   非成员函数或静态成员函数。 由于   函数到指针的隐式转换,运算符的地址为   可选: