当前位置: 首页 > article >正文

C++ 各标准的新特性

C++ 各标准的新特性:详细解释和示例

C++ 标准从 C++98 到 C++20 引入了很多重要的新特性。为了方便理解和查找,我将 C++ 各个版本(C++11、C++14、C++17、C++20)的主要新特性列出。


C++ 标准的新特性概览

特性C++11C++14C++17C++20
自动类型推断(auto✔️✔️✔️✔️
范围-based for 循环✔️✔️✔️✔️
Lambda 表达式✔️✔️✔️✔️
智能指针(unique_ptr, shared_ptr✔️✔️✔️✔️
右值引用和移动语义✔️✔️✔️✔️
constexpr✔️✔️✔️✔️
线程支持(<thread>✔️✔️✔️✔️
std::make_unique✔️✔️✔️
内联变量(inline variable✔️✔️
std::optional✔️✔️
结构化绑定声明✔️✔️
std::filesystem✔️✔️
模块(modules✔️
概念(Concepts✔️
协程(coroutines✔️
std::ranges✔️

C++11 新特性详细解释与示例

  1. 自动类型推断(auto

    • auto 让编译器根据表达式的类型自动推断变量的类型,避免显式声明。

    示例

    auto x = 5;   // x 推断为 int
    auto y = 3.14; // y 推断为 double
    
  2. 范围-based for 循环

    • 通过 range-based for 循环简化容器遍历。

    示例

    std::vector<int> nums = {1, 2, 3, 4};
    for (auto n : nums) {
        std::cout << n << " ";  // 输出:1 2 3 4
    }
    
  3. Lambda 表达式

    • 可以定义匿名函数,尤其在处理短小的函数时非常方便。

    示例

    std::vector<int> nums = {1, 2, 3, 4};
    std::for_each(nums.begin(), nums.end(), [](int n) {
        std::cout << n << " ";  // 输出:1 2 3 4
    });
    
  4. 右值引用和移动语义

    • 引入了右值引用,使得对象的移动变得可能,提升了性能,避免了不必要的拷贝。

    示例

    std::vector<int> createVector() {
        return std::vector<int>{1, 2, 3};  // 使用移动语义,避免拷贝
    }
    
  5. constexpr

    • constexpr 函数在编译时求值,允许在编译阶段执行一些计算,提升效率。

    示例

    constexpr int square(int x) {
        return x * x;
    }
    int arr[square(3)];  // 在编译时计算 9
    

C++14 新特性详细解释与示例

  1. std::make_unique

    • std::make_unique 是一种创建 unique_ptr 的安全方法。

    示例

    std::unique_ptr<int> p = std::make_unique<int>(10); // 创建并初始化
    
  2. Lambda 表达式的泛型支持

    • C++14 允许 Lambda 表达式使用 auto 关键字来推断参数类型。

    示例

    auto add = [](auto a, auto b) { return a + b; };
    std::cout << add(1, 2) << std::endl;  // 输出:3
    std::cout << add(1.1, 2.2) << std::endl;  // 输出:3.3
    

C++17 新特性详细解释与示例

  1. std::optional

    • std::optional 表示一个可能包含值的对象,适用于返回可能失败的操作结果。

    示例

    std::optional<int> divide(int x, int y) {
        if (y == 0) return std::nullopt;  // 返回空值
        return x / y;
    }
    
  2. 结构化绑定声明

    • 允许一次性解构多个值(如从 std::pairstd::tuple 中提取)。

    示例

    std::pair<int, double> p = {10, 3.14};
    auto [x, y] = p;  // x = 10, y = 3.14
    
  3. std::filesystem

    • C++17 引入了标准库中的文件系统支持,可以更方便地进行文件操作。

    示例

    #include <filesystem>
    namespace fs = std::filesystem;
    for (const auto& entry : fs::directory_iterator("/path/to/dir")) {
        std::cout << entry.path() << std::endl;
    }
    

C++20 新特性详细解释与示例

  1. 模块(modules

    • 模块可以减少头文件的编译时间,提高构建效率。

    示例(C++20 模块声明):

    export module my_module;   // 模块声明
    export int add(int a, int b) { return a + b; }
    
  2. 概念(Concepts

    • Concepts 用于限制模板类型,可以使模板代码更加健壮和可读。

    示例

    template <typename T>
    concept Addable = requires(T a, T b) {
        { a + b } -> std::same_as<T>;
    };
    
    template <Addable T>
    T add(T a, T b) {
        return a + b;
    }
    
  3. 协程(coroutines

    • 协程支持简化异步编程,允许你以同步的方式编写异步代码。

    示例

    #include <coroutine>
    #include <iostream>
    
    std::coroutine_handle<> handle;
    
    std::string async_func() {
        co_return "Hello from coroutine";
    }
    
    int main() {
        auto result = async_func();
        std::cout << result << std::endl;  // 输出:"Hello from coroutine"
    }
    
  4. std::ranges

    • ranges 提供了对容器和序列的更简便的操作方式,避免了手动使用迭代器。

    示例

    #include <ranges>
    std::vector<int> v = {1, 2, 3, 4};
    auto result = v | std::ranges::transform([](int n) { return n * 2; });
    for (auto& n : result) {
        std::cout << n << " ";  // 输出:2 4 6 8
    }
    

总结

C++标准新特性
C++11自动类型推断、右值引用、constexpr、范围-based for 循环、Lambda 表达式
C++14std::make_unique、Lambda 泛型支持

| C++17 | std::optional、结构化绑定声明、std::filesystem |
| C++20 | 模块、概念、协程、std::ranges |

每个新标准引入的新特性都增强了 C++ 的表达能力和编程效率,通过这些新特性,可以更加高效、安全和简洁地编写 C++ 代码。


http://www.kler.cn/a/487927.html

相关文章:

  • JavaScript系列(16)--原型继承
  • C#异步多线程——ThreadPool线程池
  • 【实用技能】如何使用 .NET C# 中的 Azure Key Vault 中的 PFX 证书对 PDF 文档进行签名
  • 网络安全-web应用程序发展历程(基础篇)
  • Mac-docker配置
  • 什么是网络安全攻防演练,即红蓝对抗?
  • 【Oracle专栏】实用SQL、查询处理
  • 【update 更新数据语法合集】.NET开源ORM框架 SqlSugar 系列
  • 跨域问题,开发
  • QML states和transitions的使用
  • 油猴支持阿里云自动登陆插件
  • kotlin项目无法访问Java类的问题
  • 龙蜥Linux系统部署docker21.1.3版本
  • 同域名前后端分离项目 nginx配置实践
  • LCE(Local Cascade Ensemble)预测模型和LSTM(Long Short-Term Memory)模型在效果和特点上存在显著差异
  • 3D目标检测数据集——kitti数据集
  • 计算机网络之---HTTP协议
  • TDengine + MQTT :车联网时序数据库如何高效接入
  • 第一天 了解HarmonyOS的起源、发展、核心特性
  • 每天40分玩转Django:Django 实操图书管理系统
  • 一款面向数字孪生的数据中台
  • QT 常用控件的常用方法
  • Zookeeper 集群安装
  • 机房预约系统|Java|SSM|JSP|
  • 在 Vivado 的 Block Design 中,如果你不想让某个 IP 核的引脚连接到外部引脚,可以通过以下几种方法来处理:
  • Flutter Web 选取并上传图片