使用new和values进行数组初始化,但没有明确的元素数量

时间:2018-10-03 14:40:00

标签: c++ arrays initialization new-operator

在许多C系列语言中,可以使用初始元素列表中隐含的元素数量来初始化数组。例如。在Java中:

int[] ints = new int[] {0, 1, 2, ...}

Stroustrup在“编程:使用C ++的原理和实践”的第597页上写道,可以在C ++中使用类似的语法:

double* p5 = new double[] {0, 1, 2, 3, 4};

但是,当尝试使用GCC或Clang进行编译时,由于出现括号中的表达式,我会收到错误消息:

$ g++ main.cpp
main.cpp: In function 'int main()':
main.cpp:17:26: error: expected primary-expression before ']' token
  double* p5 = new double[]{0, 1, 2, 3, 4};
                          ^
main.cpp:17:41: error: too many initializers for 'double [1]'
  double* p5 = new double[]{0, 1, 2, 3, 4};
                                         ^

使用Clang:

 $ clang++ main.cpp
 main.cpp:17:26: error: expected expression
         double* p5 = new double[]{0, 1, 2, 3, 4};
                                 ^
 main.cpp:17:19: error: excess elements in scalar initializer
         double* p5 = new double[]{0, 1, 2, 3, 4};
                          ^         ~~~~~~~~~~~~~
 2 errors generated.

这本书错了吗?我看到至少有一个SO用户向一个不相关的问题(该代码也没有为我编译)推荐给这样的人。

2 个答案:

答案 0 :(得分:-1)

这本书似乎是一个错误。 C ++中的数组不是Java之类的对象,它是内存中的一个块,该块的指针指向第一个元素,因此语法new double[] {}不合理。

使用:

double * d = {1,2,3,4};

答案 1 :(得分:-1)

当在数组声明中 时,C ++可以省略数组的大小,该大小可以从初始化程序中推导得出,例如:

double d[] = { 0, 1, 2, 3, 4 };   // ok 5 elements
char std[] = "foo";               // ok 4 elements with the terminating null

但是double* p5 = new double[5];不是数组声明。它声明了一个原始指针,该指针已初始化为指向动态分配的数组。

两个声明确实具有非常接近的语义,因为例如,两个声明都允许部分初始化(double* p5 = new double[5]{0, 1, 2};)。但是您建议的语法未在标准中定义,并且当前版本的Clang或gcc不接受。

扩展语言以接受它很容易,但是恕我直言,这不太可能发生:

  • 数组不是该语言的一流元素,建议程序员改用容器
  • 原始指针不再是一流的元素,建议程序员改用引用或智能指针