以下是visual studio 2012中的一个错误。
void do_something(std::unique_ptr<int> i);
std::unique_ptr<int> i(new int);
std::thread(do_something, std::move(i));
错误3错误C2248:'std :: unique_ptr&lt; _Ty&gt; :: unique_ptr':无法访问类'std :: unique_ptr&lt; _Ty&gt;'中声明的私有成员c:\ program files(x86)\ microsoft visual studio 11.0 \ vc \ include \ functional 1152 1 scratch 它有助于(!)在功能上指向这个定义: _VARIADIC_EXPAND_0X(_CLASS_BIND ,,,,)
这很好:
do_something(std::move(i));
我做错了什么?
答案 0 :(得分:4)
我做错了什么?
几乎什么都没有。事实上,你的程序是合法的,其行为也很明确。
您获得的编译器错误必然是编译器附带的标准库实现中的错误,可能与VC11不支持可变参数模板的事实相关,并且用于伪造它们的基于宏的机制是不完美。
这就是说,即使你的程序编译了,你仍然需要在std::thread
RAII包装器被破坏之前加入你的线程或从中断开 - 如果std::thread
的析构函数抛出异常在封装的线程仍在运行时调用(除非它被分离)。