优秀的编程知识分享平台

网站首页 > 技术文章 正文

C++20 新特性(6):new表达式也支持数组大小推导

nanyue 2025-03-12 18:54:25 技术文章 4 ℃

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)。


【往期回顾】

C++20 新特性(5):集合初始化与用户声明构造函数澄清

C++20 新特性(4):使用圆括号的多个类成员变量初始化

C++20 新特性(3):指定类成员变量初始化

C++ 20 新特性(2):支持位段类型的类成员的直接初始化

C++20新特性(1):前言,废弃数组下标中的逗号表达式

最近发表
标签列表