为什么在传递给线程构造函数时要将仿函数放在括号内?
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{} };
#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{} };