C++ 为什么动态分配的数组不能从列表初始值设定项推断其大小?
原因是: 新的int[]{10,20,30,40,50} 至少在C++14之前是非法的,gcc 6.3的错误: 错误:“int[1]”的初始值设定项太多 《为什么》很无聊。需要完整的对象类型: 新表达式尝试创建id或id类型的对象 应用它的新类型id。该对象的类型是 已分配类型。该类型应为完整的对象类型,但不是 抽象类类型或其数组C++ 为什么动态分配的数组不能从列表初始值设定项推断其大小?,c++,language-lawyer,C++,Language Lawyer,原因是: 新的int[]{10,20,30,40,50} 至少在C++14之前是非法的,gcc 6.3的错误: 错误:“int[1]”的初始值设定项太多 《为什么》很无聊。需要完整的对象类型: 新表达式尝试创建id或id类型的对象 应用它的新类型id。该对象的类型是 已分配类型。该类型应为完整的对象类型,但不是 抽象类类型或其数组 由于int[]是一个不完整的对象类型,因此它的格式不正确。您可以编写一个专用的帮助程序: template<typename TItem, TItem... V
由于int[]是一个不完整的对象类型,因此它的格式不正确。您可以编写一个专用的帮助程序:
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);
事实就是这样。考虑使用STD:vector或STD::Orth.和什么构成一个完整的对象类型?@ RoTEM -任何对象类型,它不是一个不完全的对象类型,如标准明确定义的。我认为Adple会很好地追问后续问题,为什么编译器不能从初始化列表中推断出完整的类型?是否有一个实际的原因会造成歧义,或者只是随意省略?@Rotem-后者。如果使用占位符类型auto,编译器当然可以推断出类型。但这一过程是明确描述的。可以调整标准以使OP的代码格式良好。但这需要有人来写提案,并说服委员会将其表决为C++20。@Rotem它可以在arr[]={…}中辩论;是任意添加的,而不是反过来添加的,arr毕竟应该声明为int[]类型。