为什么动态分配的数组不能从列表初始化器中推断出它的大小?

时间:2017-11-05 14:42:41

标签: c++ language-lawyer

为什么:

new int[]{10,20,30,40,50};

非法(至少从C ++ 14开始)?,gcc 6.3的错误:

  

错误:'int [1]'

的初始化程序太多

2 个答案:

答案 0 :(得分:3)

"为什么"相当无聊。 [expr.new]/1需要完整的对象类型:

  

new-expression尝试创建type-id或的对象   应用它的new-type-id。该对象的类型是   分配类型。 此类型应为完整的对象类型,但不是   抽象类类型或其数组。

由于finalizeLazyIO是一种不完整的对象类型,因此格式不正确。

答案 1 :(得分:1)

你可以写一个专门的帮手:

template<typename TItem, TItem... VInitialValues> auto
make_array(void) -> ::std::unique_ptr<TItem[]>
{
    return
    (
        ::std::unique_ptr<TItem[]>
        {
            new TItem[sizeof...(VInitialValues)]
            {
                VInitialValues...
            }
        }
    );
}

make_array<int, 10, 20, 30, 40, 50>();

或者像这样:

template<typename TItem, typename... TInitialValues> auto
make_array(TInitialValues && ... initial_values) -> ::std::unique_ptr<TItem[]>
{
    return
    (
         ::std::unique_ptr<TItem[]>
         {
             new TItem[sizeof...(TInitialValues)]
             {
                 ::std::forward<TInitialValues>(initial_values)...
             }
         }
    );
}

make_array<int>(10, 20, 30, 40, 50);