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

#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::initializer_list参数不是constexpr。它的.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;
}

像这样使用:
auto arr_ptr2 = make_unique_arr<int>(1,2,3,4,5);

关于c++ - 具有初始化程序的std::make_unique <int []>的模板,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41618307/

10-11 23:15
查看更多