Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么动态分配的数组不能从列表初始值设定项推断其大小?_C++_Language Lawyer - Fatal编程技术网

C++ 为什么动态分配的数组不能从列表初始值设定项推断其大小?

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[]{10,20,30,40,50}

至少在C++14之前是非法的,gcc 6.3的错误:

错误:“int[1]”的初始值设定项太多

《为什么》很无聊。需要完整的对象类型:

新表达式尝试创建id或id类型的对象 应用它的新类型id。该对象的类型是 已分配类型。该类型应为完整的对象类型,但不是 抽象类类型或其数组


由于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[]类型。