在许多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用户向一个不相关的问题(该代码也没有为我编译)推荐给这样的人。
答案 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不接受。
扩展语言以接受它很容易,但是恕我直言,这不太可能发生: