我试图了解如何使用Visual Studio 2012使用新的std :: thread。我正在尝试编译以下代码。
#include <iostream>
#include <thread>
class scoped_thread
{
std::thread t_;
public:
explicit scoped_thread(std::thread & t): t_(std::move(t))
{
if(!t_.joinable())throw std::logic_error("No thread");
}
~scoped_thread()
{
t_.join();
}
private:
scoped_thread(scoped_thread const &);
scoped_thread & operator=(scoped_thread const &);
};
struct local_functor
{
int& i_;
local_functor(int & i):i_(i){}
void operator()()
{
while(i_ < 1e5)i_++;
}
};
// can potentially throw exceptions
void callAnotherFunc()
{
std::cout << "this function can throw an exception" << std::endl;
// try (un)commenting the line below and see the behaviour
throw std::out_of_range("WTF2");
}
int main()
{
int some_local_state = 0;
try
{
scoped_thread t(std::thread(local_functor(some_local_state)));
callAnotherFunc();
std::cout << "Proper exit of function" << std::endl;
}
catch(const std::exception & e)
{
std::cout << e.what() << " exception occurred!" << std::endl;
}
catch(...)
{
std::cout << "Unhandled exception!" << std::endl;
}
return 0;
}
我收到警告说 警告C4930:'scoped_thread t(std :: thread(__ cdecl *)(local_functor))':未调用prototyped函数(是否为变量定义?)
是的,这是一个有意的变量定义。我该怎么做?
答案 0 :(得分:7)
警告告诉您,try块中的第一行被解析为函数声明。如果您使用C ++ 03初始化样式,有时会发生这种情况。请改用统一初始化:
scoped_thread t{std::thread{local_functor{some_local_state}}};
此外,scoped_thread构造函数中缺少&
:
explicit scoped_thread(std::thread && t): t_(std::move(t))
// ^-- use r-value ref
PS:
如果编译器不支持统一初始化,请将初始化程序包装到另一对括号中:scoped_thread t((std::thread(local_functor(some_local_state))));
答案 1 :(得分:6)
你偶然发现the most vexing parse。
您可以使用uniform initialization语法解决此问题:
scoped_thread t{std::thread(local_functor(some_local_state))};