为什么:
new int[]{10,20,30,40,50};
非法(至少从C ++ 14开始)?,gcc 6.3的错误:
错误:'int [1]'
的初始化程序太多
答案 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);