C++ std::make_unique的模板<;int[]>;带初始值设定项

C++ std::make_unique的模板<;int[]>;带初始值设定项,c++,arrays,templates,unique-ptr,C++,Arrays,Templates,Unique Ptr,以下内容不会编译并在注释中产生错误: #include <memory> #include <initializer_list> template <typename T, typename E> std::unique_ptr<T> make_unique_arr(const std::initializer_list<E>& il) { //std::unique_ptr<T> p{new int[il

以下内容不会编译并在注释中产生错误:

#include <memory>
#include <initializer_list>

template <typename T, typename E>
std::unique_ptr<T> make_unique_arr(const std::initializer_list<E>& il)
{
    //std::unique_ptr<T> p{new int[il.size()]{1,2,3,4,5}}; //works

    // gcc error: cannot convert 'const std::initializer_list<int>' to 'int' in initialization
    // VS2015 error C2440: 'initializing': cannot convert from 'const std::initializer_list<int>' to 'int []'
    std::unique_ptr<T> p{new int[il.size()]{il}}; 
    return p;
}

int main()
{
    std::unique_ptr<int[]> arr_ptr1{new int[5]{1,2,3,4,5}};
    auto arr_ptr2{make_unique_arr<int[]>({1,2,3,4,5})};
}
#包括
#包括
模板
std::unique\u ptr make\u unique\u arr(const std::initializer\u list&il)
{
//std::unique_ptr p{new int[il.size()]{1,2,3,4,5};//有效
//gcc错误:无法在初始化中将“const std::initializer_list”转换为“int”
//VS2015错误C2440:“正在初始化”:无法从“const std::initializer_list”转换为“int[]”
std::unique_ptr p{new int[il.size()]{il};
返回p;
}
int main()
{
std::unique_ptr arr_ptr1{new int[5]{1,2,3,4,5};
自动arr_ptr2{make_unique_arr({1,2,3,4,5})};
}

如何编写模板以直接使用初始值设定项列表?

数组的
std::initializer\u list
参数不是
constepr
。它的
.size()
不是
constexpr

因此,您不能以任何实际方式将其内容扩展为
{}

您可以这样做:

template <class T, class...Es>
std::unique_ptr<T[]> make_unique_arr(Es&&...es){
  std::unique_ptr<T[]> r( new T[sizeof...(Es)]{ std::forward<Es>(es)... } );
  return r;
}
模板
标准::唯一性\u ptr使\u唯一性\u arr(Es&&…Es){
std::unique_ptr r(新的T[sizeof…(Es)]{std::forward(Es…});
返回r;
}
用法如下:

auto arr_ptr2 = make_unique_arr<int>(1,2,3,4,5);
auto arr\u ptr2=make\u unique\u arr(1,2,3,4,5);