我正在使用带有c ++ 11标志的g ++ 4.7.在这个演示中:
#include <iostream>
#include <thread>
class do_work
{
public:
void operator()()
{
std::cout << "Doing work..." << std::endl;
}
};
void foo()
{
}
int main()
{
// Does not work
std::thread t(do_work);
t.join(); // error: request for member ‘join’ in ‘t’, which is of non-class type ‘std::thread(do_work)’
// Works
std::thread t2(foo);
t2.join();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我可以在一个用函数作为构造函数参数创建的线程上成功调用join(),但我不能在用functor作为构造函数参数创建的线程上调用join()(请参阅错误内联).有谁能解释一下?
eca*_*mur 12
你已经宣布t为一个接受do_work和返回的函数std::thread.
你可能想写
do_work worker;
std::thread t{worker};
Run Code Online (Sandbox Code Playgroud)
要么
std::thread t{do_work{}};
Run Code Online (Sandbox Code Playgroud)
要么
std::thread t((do_work()));
Run Code Online (Sandbox Code Playgroud)
注意
std::thread t(do_work());
Run Code Online (Sandbox Code Playgroud)
不行; 它被烦恼地解析为声明一个函数t接受一个不带参数和返回的函数do_work,然后返回std::thread.do_work用括号包装临时或使用统一的初始化语法(在任何时候)将修复它.
这是养成尽可能使用统一初始化语法的习惯的一个很好的理由; 如果你写的
std::thread t{do_work}; // incorrect
Run Code Online (Sandbox Code Playgroud)
然后编译将失败在该行而不是join.
| 归档时间: |
|
| 查看次数: |
599 次 |
| 最近记录: |