我在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
方法失败?
答案 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。