绑定错误 make_unique

Error binding make_unique

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

我有一个对象,我向其构造函数传递了工厂函数,用于制作 std::unique_ptr 另一种 class 类型的对象。

使用 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 );

错误消息状态:

error C2512: 'AlphaBetaSingleThread' : no appropriate default constructor available

error C2512: 'AlphaBetaSingleThreadSSE' : no appropriate default constructor available

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

std::make_unique定义如下:

§ 20.8.1.4 [unique.ptr.create]

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

1 Remarks: This function shall not participate in overload resolution unless T is not an array.

2 Returns: 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 的默认构造函数(不存在,如错误消息所述)。

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

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

但是你不会从完美转发中受益,而且这也不是一个可移植的解决方案。更好的解决方案是继续使用 lambda。