网站首页 > 技术文章 正文
new表达式也支持数组大小推导
在 C++17 标准中,在定义并初始化静态数组时,是可以忽略数组大小,然后通过初始化数据来推导数组的大小。但使用new来定义并初始化动态数组时,并不支持这种自动推导数组大小的方式,其实这两者原理上是很类似的,增加支持能够使初始化语法更统一,因此 C++20 中加入了类似的语法:
char s1[] = "Hello"; // <1> 很早就支持,自动推导数组大小
char s2[] { "Hello" }; // <2> C++11 开始支持,大括号的列表初始化,自动推导数组大小
char * s3 = new char[] { "Hello" }; // <3> C++20 新增,new也可以自动推导数组大小
double d1[] ( 1, 2, 3 ); // <6> C++20 新增圆括号的列表初始化
double * d2 = new double[] ( 1, 2, 3 ); // <7> C++20 新增,new使用圆括号初始化,也支持自动推导数组大小
自动推导数组大小,带来另一个问题,就是0长度的数组进行初始化的问题,C++20中也一起进行完善:
struct SA
{
int len;
char str[0]; // <1> 结构体中的零长度数组,非标准扩展
// 但大部分编译器都支持,方便访问不定长的buffer数据
};
int a1[0]; // <2> Error,非结构体联合体内的零长度数组,不合法代码,但gcc支持,MSVC不支持
int a2[0] {}; // <3> Error,同上
int a3[] {}; // <4> Error,同上
int* a4 = new int[0] {}; // <5> OK,new生成0长度数组
int* a5 = new int[] {}; // <6> C++20新增,new支持初始化推导数组大小,0长度数组也支持
这个改动看上去并不复杂,普通数组能支持,new表达式应该也是类似的。但奇怪的是,这个功能在 GCC 10.x 和 VS 2019 的最新16.7 版本上都不支持,很多 C++20 的功能在 GCC 8.x 就已经支持,但这个功能还是要等到 GCC 11.x 才能支持,或者VS 2019 的预览版(preview版,16.8)。
【往期回顾】
猜你喜欢
- 2025-03-12 结构体(Struct)
- 2025-03-12 Mysql数据库tinyint,int,bigint,char,varchar究竟用哪个?
- 2025-03-12 吃透c语言难点—指针
- 2025-03-12 动手打造深度学习框架:基本数据结构与算法
- 2025-03-12 C语言指针访问数组基础知识,理解各种符号的意义
- 2025-03-12 C语言结构体中只有一个数组,这么做有什么好处?是多此一举吗?
- 2025-03-12 C语言结构体定义与赋值
- 2025-03-12 C++提高部分_C++函数模板_案例_数组排序---C++语言工作笔记083
- 2025-03-12 C#学习随笔—操作BIN文件(读,写,替代)
- 2025-03-12 C语言之数组
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)