使用std :: move在VS1012中将std :: unique_ptr发送到std :: thread

时间:2013-05-23 10:51:51

标签: c++ visual-studio-2012 c++11

以下是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));

我做错了什么?

1 个答案:

答案 0 :(得分:4)

  

我做错了什么?

几乎什么都没有。事实上,你的程序是合法的,其行为也很明确。

您获得的编译器错误必然是编译器附带的标准库实现中的错误,可能与VC11不支持可变参数模板的事实相关,并且用于伪造它们的基于宏的机制是不完美。

这就是说,即使你的程序编译了,你仍然需要在std::thread RAII包装器被破坏之前加入你的线程或从中断开 - 如果std::thread的析构函数抛出异常在封装的线程仍在运行时调用(除非它被分离)。