13

以下给了我 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<_Ty>::unique_ptr”:无法访问在类“std::unique_ptr<_Ty>”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));

我究竟做错了什么?

4

1 回答 1

5

我究竟做错了什么?

几乎没有。事实上,您的程序是合法的,并且它的行为是明确定义的。

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

这就是说,即使您的程序确实编译了,您仍然必须在 RAII 包装器被破坏之前加入您的线程或从它分离- 如果在封装的线程仍在运行时调用std::thread析构函数,则会引发异常(除非它是std::thread分离)。

于 2013-05-23T10:56:53.813 回答