1

给定一个函数

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(...)工作。此外,使用 ashared_ptr也可以

  • 为什么 unique_ptr 不允许?
  • 这是 MSVC 问题还是一般 C++11 限制?
  • 有没有不改变函数定义的变通方法?
4

2 回答 2

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;
}
于 2014-06-29T19:36:51.387 回答
0

一种解决方法是拥有

void MyFunction(std::unique_ptr<int>& arg)

但如果你不能改变函数定义,那是行不通的。

于 2013-06-17T06:00:19.873 回答