为什么在传递给线程构造函数时要将仿函数放在括号内?

why should the functor be placed inside the brackets while passing to thread costructor?

#include <iostream>
#include <thread>
class DisplayThread
{
public:
    void operator()()     
    {
        for(int i = 0; i < 10000; i++)
            std::cout<<"Display Thread Executing"<<std::endl;
    }
};
 
int main()  
{
   //line 1:
    std::thread threadObj( (DisplayThread()) );
    for(int i = 0; i < 10000; i++)
        std::cout<<"Display From Main Thread "<<std::endl;
    std::cout<<"Waiting For Thread to complete"<<std::endl;
    threadObj.join();
    std::cout<<"Exiting from Main Thread"<<std::endl;
    return 0;
}
    

在第 1 行:如果我使用类似“threadObj(DisplayThread())”,它会给出一个 错误说没有 class 类型。

有人能告诉我为什么传递给线程构造函数的仿函数必须在“()”大括号内吗?

恭喜...某种程度上:您已成为称为 Most Vexing Parse 的 C++ 现象的受害者:基本上,编译器倾向于将您的语句解释为函数声明。你没有错 - 这是语言歧义的结果,恰好以一种有点不直观的方式解决了。

当您删除 DisplayThread() 周围的括号时,您 get 的错误是:

<source>: In function 'int main()':

<source>:20:15: error: request for member 'join' in 'threadObj', which is of 
non-class type 'std::thread(DisplayThread (*)())'
   20 |     threadObj.join();
      |               ^~~~

编译器认为threadObj是一个函数,它接受一个函数指针和returns一个std::thread!

如果您使用 curly-braces 进行 no-argument 构造,则为 resolved,如下所示:

std::thread threadObj{ DisplayThread{} };