在编译时遇到问题。我创建一个函数对象并尝试传递一个唯一的指针,但编译器抱怨说我正在尝试访问unique_ptr中的私有数据。这发生在msvc 2012 v110中。
class Work
{
};
class A
{
public:
void doWork(Work w)
{
std::cout << " - - ";
return;
}
void doWork2(std::unique_ptr<Work> w)
{
std::cout << " - - ";
return;
}
};
int main()
{
A a;
std::unique_ptr<Work> w2 = std::unique_ptr<Work>(new Work());
Work w;
auto func = std::bind(&A::doWork, a, std::placeholders::_1);
auto func2 = std::bind(&A::doWork2, a, std::placeholders::_1);
func(w);
func2(std::move(w2));
return 0;
}
答案 0 :(得分:0)
这看起来像VC中的错误。另请参阅this bug report on Microsoft Connect。
VC似乎将占位符参数作为左值引用而不是使用完美转发。
该示例在gcc(live sample on coliru)上编译正确。
作为一种解决方法,您可以使用lambda而不是std::bind
:
auto func2 = [&a](std::unique_ptr<Work> w) { a.doWork2(std::move(w)); };