使用 new 和 值进行数组初始化,但没有显式数量的元素
Array initiliazation using new and values but no explicit number of elements
在许多C系列语言中,可以使用初始元素列表中隐含的元素数量初始化数组。 例如在Java中:
int[] ints = new int[] {0, 1, 2, ...}
在"编程:使用C++的原则和实践"的第597页,Stroustrup写道,可以在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++ 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 用户向有不相关问题的人推荐这个(该代码也没有为我编译(。
这似乎是书中的一个错误。 C++中的数组不是像 Java 这样的对象,它是内存中的一个块,它有一个指向第一个元素的指针,因此语法new double[] {}
不合理。
用:
double * d = {1,2,3,4};
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 接受。
扩展语言以接受它很容易,但恕我直言,这不太可能发生:
- 数组不是语言的第一类元素,建议程序员使用容器代替
- 原始指针不再是第一类元素,建议程序员改用引用或智能指针
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 是否可以使用 new 指定具有宏常量的动态分配数组的元素?
- 使用 new 和 值进行数组初始化,但没有显式数量的元素
- 在 new 关键字中,由默认构造函数初始化的类中的元素是否也使用 new 关键字在C++?
- placement new和vector::data()可以用来替换向量中的元素吗
- new[] 如果元素默认构造函数可以抛出
- 指针向量,其元素用new初始化:赋给新值时会发生什么
- 从指针向量中删除元素,并释放先前通过new操作符分配的动态内存
- 当每个字符串由"new char[]"创建时,如何对"vector<string>"的元素调用"delete"?
- 获取使用operator new[]分配的单个元素的大小或元素计数