绑定make_unique时出错

时间:2015-10-20 06:53:22

标签: c++ c++11 unique-ptr stdbind

我在std::bind使用std::make_unique时遇到问题。

我有一个对象,我的构造函数传递工厂函数来生成另一个类类型的对象std::unique_ptr

使用VS2013,这可行:

Tester tester( 
    [](){return std::make_unique<AlphaBetaSingleThreadSSE>( 0,7 ); },
    [](){return std::make_unique<AlphaBetaSingleThread>( 0,7 ); },
    20 );

这给了我编译错误:

Tester tester( 
    std::bind( std::make_unique<AlphaBetaSingleThreadSSE>,0,7 ),
    std::bind( std::make_unique<AlphaBetaSingleThread>,0,7 ),
    20 );

错误消息状态:

  

错误C2512:'AlphaBetaSingleThread':没有合适的默认值   可用的构造函数

     

错误C2512:'AlphaBetaSingleThreadSSE':没有   适当的默认构造函数

为什么std::bind方法失败?

1 个答案:

答案 0 :(得分:5)

std::make_unique定义如下:

§20.8.1.4[unique.ptr.create]

template <class T, class... Args> unique_ptr<T> make_unique(Args&&... args);
     

1 备注:除非T不是数组,否则此函数不应参与重载决策。

     

2 返回unique_ptr<T>(new T(std::forward<Args>(args)...)).

通过使用std::make_unique<AlphaBetaSingleThreadSSE>显式实例化此功能模板,您最终会获得以下专业化:

std::unique_ptr<AlphaBetaSingleThreadSSE> make_unique()
{
    return std::unique_ptr<AlphaBetaSingleThreadSSE>(new AlphaBetaSingleThreadSSE());
}

也就是说,它不再允许您传递将转发给AlphaBetaSingleThreadSSE的构造函数的其他参数,而是尝试使用AlphaBetaSingleThreadSSE的默认构造函数(其中没有' t存在为错误消息状态)。

您可以通过指定类型模板参数Args来解决这个问题:

std::make_unique<AlphaBetaSingleThreadSSE, const int&, const int&>

但是你不会从完美转发中受益,而且这不是一个便携式解决方案。一个更好的解决方案是留下一个lambda。