C++20 DR11:数组 `new` 可以推导出数组大小

举报
码事漫谈 发表于 2025/03/07 15:53:58 2025/03/07
【摘要】 背景与动机 C++20 的改进 示例代码 编译器支持 总结在 C++20 中,DR11 提案(P1009R2)引入了一项重要的语言特性改进:数组 new 表达式可以自动推导数组大小。这一改进极大地简化了动态数组的创建过程,使代码更加简洁易读。 背景与动机在 C++17 及之前的版本中,动态分配数组时,必须显式指定数组的大小。例如:int* arr = new int[10]; // 显式指...

在 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 的编译器,可以开始尝试这一新特性,以提升你的代码质量。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。