c 11 std :: thread用函数编译,但不编译
发布时间:2020-12-16 10:22:58 所属栏目:百科 来源:网络整理
导读:我使用g 4.7和c 11标志.在这个演示中: #include iostream#include threadclass 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: req
我使用g 4.7和c 11标志.在这个演示中:
#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; } 我可以在一个用函数作为构造函数参数创建的线程上成功调用join(),但我不能在用functor作为构造函数参数创建的线程上调用join()(请参阅错误内联).有谁能解释一下? 解决方法
你已经将t声明为一个带do_work并返回std :: thread的函数.
你可能想写 do_work worker; std::thread t{worker}; 要么 std::thread t{do_work{}}; 要么 std::thread t((do_work())); 注意 std::thread t(do_work()); 不行;它是vexingly parsed声明一个函数t采用一个不带参数的函数并返回do_work,并返回std :: thread.用括号包装do_work临时或使用统一的初始化语法(在任何时候)将解决它. 这是养成尽可能使用统一初始化语法的习惯的一个很好的理由;如果你写的 std::thread t{do_work}; // incorrect 然后编译将在该行而不是连接失败. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |