给出类似
的功能void MyFunction(std::unique_ptr<int> arg);
无法创建类似
的仿函数(MSVC 2012)std::function<void(std::unique_ptr<int>)> f = std::bind(&MyFunction, std::placeholders::_1);
问题不在于绑定 - 使用auto f = std::bind(...)
有效。此外,使用shared_ptr
也可以
答案 0 :(得分:3)
下面的代码使用gcc 4.8进行编译。你会注意到的 如果没有用move调用“g”(将左值转换为右值), 代码无法编译。如前所述,绑定成功,因为 失败只发生在调用operator()(...)时,因为 事实上unique_ptr是不可复制的。呼叫“f”是允许的,如 shared_ptr有一个拷贝构造函数。
#include <functional>
#include <memory>
void foo1( std::shared_ptr<int> ){}
void foo2( std::unique_ptr<int> ){}
int main()
{
using namespace std::placeholders;
std::function<void(std::shared_ptr<int>)> f = std::bind( foo1, _1 );
std::function<void(std::unique_ptr<int>)> g = std::bind( foo2, _1 );
std::unique_ptr<int> i( new int(5) );
g( move( i ) ); //Requires the move
std::shared_ptr<int> j( new int(5) );
f( j ); //Works fine without the move
return 0;
}
答案 1 :(得分:0)
解决方法是
void MyFunction(std::unique_ptr<int>& arg)
但如果您无法更改功能定义,则无效。