C++ 将唯一的_ptr传递给函数对象
在编译下面的代码时遇到问题。我创建一个函数对象并尝试传递一个唯一指针,但编译器抱怨说我试图访问unique_ptr中的私有数据。这发生在msvc 2012 v110中C++ 将唯一的_ptr传递给函数对象,c++,c++11,C++,C++11,在编译下面的代码时遇到问题。我创建一个函数对象并尝试传递一个唯一指针,但编译器抱怨说我试图访问unique_ptr中的私有数据。这发生在msvc 2012 v110中 class Work { }; class A { public: void doWork(Work w) { std::cout << " - - "; return; } void doWork2(std::unique_ptr<Work
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;
}
课堂作业
{
};
甲级
{
公众:
空榫(工作w)
{
std::cout这看起来像是VC中的一个bug。另请参阅
VC似乎将占位符参数作为左值引用传递,而不是使用完美转发
该示例在gcc()上编译得很好
作为一种解决方法,您可以使用lambda而不是std::bind
:
auto func2 = [&a](std::unique_ptr<Work> w) { a.doWork2(std::move(w)); };
autofunc2=[&a](std::unique_ptr w){a.doWork2(std::move(w));};
MinGW下的代码编译得很好。是否包含头文件?由于std::unique\u ptr是不可复制的,可能MSVS10很难确定该调用是否应该是直接初始化,或者您正在尝试使用私有std::unique\u ptr(const unique\u ptr)您可以尝试使用brace init list,这样您就可以在gcc上很好地编译std::unique_ptr w2{new Work{}};了