C++20 新特性(6):new表达式也支持数组大小推导
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)。
【往期回顾】