我试图让这段代码工作,但我无法理解我错在哪里 以下代码不会打印" foo"和#34;在这里我' m"字符串
class scoped_thread
{
std::thread t;
public:
explicit scoped_thread(std::thread t_):t(std::move(t_))
{
std::cout<<"here I'm"<<std::endl;
if(!t.joinable())
throw std::logic_error("No thread");
}
~scoped_thread()
{
t.join();
}
scoped_thread(scoped_thread const&)=delete;
scoped_thread& operator=(scoped_thread const&)=delete;
};
void foo(){
std::cout<<"foo"<<std::endl;
}
scoped_thread t1(std::thread(foo));
它只是不会执行构造函数。
如果我将最后一行更改为
class foo1{
public:
void foo(){
std::cout<<"foo"<<std::endl;
}
}
scoped_thread t1(std::thread(&foo1::foo,&foo1));
线程foo开始工作。
我正在使用编译器的mingw 4.8.1和c ++ 11标志 我哪里错了?我试图弄清楚我必须使用哪种构造函数,但到目前为止我还没有找到它
答案 0 :(得分:1)
这被称为最令人烦恼的解析。
编译器基本上将scoped_thread t1(std::thread(foo));
视为函数声明(声明具有名为std::thread
的单个foo
参数的函数。它可以是函数声明或变量定义,但语言规则规定任何可以是两者的都是函数声明。
传统的修复方法是添加额外的括号,比如scoped_thread t1((std::thread(foo)));
使得它不再被解析为函数声明。使用C ++,您也可以使用列表初始化,它不会成为最令人烦恼的解析(尽管它有自己的问题),如scoped_thread t1{std::thread(foo)};
。