文章目录
- 背景与动机
- C++20 的改进
- 示例代码
- 编译器支持
- 总结
在 C++20 中,DR11 提案(P1009R2)引入了一项重要的语言特性改进:数组
new
表达式可以自动推导数组大小。这一改进极大地简化了动态数组的创建过程,使代码更加简洁易读。
背景与动机
在 C++17 及之前的版本中,动态分配数组时,必须显式指定数组的大小。例如:
int* arr = new int[10]; // 显式指定大小
如果使用 auto
或模板类型,编译器无法自动推导数组大小,这限制了代码的灵活性。
C++20 的改进
C++20 的 DR11 提案允许 new
表达式在某些情况下自动推导数组大小。具体来说,当使用 new
分配数组时,如果初始化列表提供了足够的信息,编译器可以自动推导数组的大小。例如:
auto arr = new int[]{1, 2, 3, 4}; // 编译器自动推导数组大小为 4
这种语法类似于 std::array
的初始化方式,但 new
表达式现在可以自动推导数组大小,而无需显式指定。
示例代码
以下是使用 C++20 DR11 特性的示例代码:
#include <iostream>
int main() {
// 自动推导数组大小
auto arr = new int[]{1, 2, 3, 4, 5};
// 输出数组内容
for (size_t i = 0; i < 5; ++i) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
// 释放内存
delete[] arr;
return 0;
}
在这个例子中,编译器根据初始化列表 {1, 2, 3, 4, 5}
自动推导出数组大小为 5。
编译器支持
截至 2025 年,主流编译器已经广泛支持 DR11 提案:
- GCC:从 11 版本开始支持。
- Clang:从 9 版本开始支持。
- MSVC:从 19.27 版本开始支持。
总结
C++20 的 DR11 提案通过允许 new
表达式自动推导数组大小,进一步简化了动态数组的创建过程。这一特性不仅减少了代码冗余,还提高了代码的可读性和灵活性。如果你正在使用支持 C++20 的编译器,可以开始尝试这一新特性,以提升你的代码质量。