我试图使用std :: make_unique来实现一个构造函数接收std :: initializer_list的类.这里有一个最小的例子:
#include <string> #include <vector> #include <initializer_list> #include <memory> struct Foo { Foo(std::initializer_list<std::string> strings) : strings(strings) {} std::vector<std::string> strings; }; int main(int,char**) { auto ptr = std::make_unique<Foo>({"Hello","World"}); return 0; }
您可以在Coliru看到它没有构建:
main.cpp:14:56: error: no matching function for call to 'make_unique(<brace-enclosed initializer list>)' auto ptr = std::make_unique<Foo>({"Hello","World"});
那么,据说make_unique无法使用initializer_lists? GCC 4.9.1中有错误吗?还是我忽略了一些东西?
解决方法
std :: make_unique是推导传递给对象构造函数的参数类型的函数模板.不幸的是,支持列表不可推导(自动声明有异常),因此当缺少参数类型时,无法实例化函数模板.
你可以不使用std :: make_unique,但请不要去那条路线 – 你应该尽可能多地避免赤裸裸的消息,为了孩子们的缘故.或者您可以通过指定类型来进行类型扣除:
> std :: make_unique< Foo>(std :: initializer_list< std :: string>({“Hello”,“World”}))
> std :: make_unique< Foo,std :: initializer_list< std :: string>>({“Hello”,“World”})
> auto il = {“你好”,“世界”}; auto ptr = std :: make_unique< Foo>(il);
最后一个选项使用自动声明的特殊规则,(正如我上面提到的)实际上推导了一个std :: initializer_list.