2017-01-12 24 views
2

と、次のコメントでエラーをコンパイルして生成されていません。テンプレートmake_unique <int[]>初期化子

#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})}; 
} 

テンプレートを直接初期化リストを使用するように書くことができますどのように?

答えて

4

std::initializer_listの配列の引数がconstexprではありません。その.size()constexprではありません。

{}に内容を展開することはできません。

あなたはこれを行うことができます。

auto arr_ptr2 = make_unique_arr<int>(1,2,3,4,5); 

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; 
} 

は次のように使用されます

関連する問題