乐途乐途
主页
  • 计算机基础

    • TCP/IP
    • Linux
    • HTTP
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C
    • C++
    • Java SE
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • Maven 入门
    • Maven 进阶
    • MyBatis
    • Spring
    • Spring MVC
  • Java

    • Spring Boot
    • Spring Cloud
    • Spring Cloud Alibaba
    • Spring Security
    • Spring AI
    • Spring Batch
    • Kafka
    • Java 设计模式
  • 缓存

    • Redis
  • 搜索引擎

    • Elasticsearch
  • 分布式协调

    • ZooKeeper
联系
阿里云
主页
  • 计算机基础

    • TCP/IP
    • Linux
    • HTTP
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C
    • C++
    • Java SE
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • Maven 入门
    • Maven 进阶
    • MyBatis
    • Spring
    • Spring MVC
  • Java

    • Spring Boot
    • Spring Cloud
    • Spring Cloud Alibaba
    • Spring Security
    • Spring AI
    • Spring Batch
    • Kafka
    • Java 设计模式
  • 缓存

    • Redis
  • 搜索引擎

    • Elasticsearch
  • 分布式协调

    • ZooKeeper
联系
阿里云
  • C++ 学习路径
  • 第1章 C++概述与开发环境

    • C++ 语言概述与编译模型
    • 第一个 C++ 程序与规范
    • 开发环境配置
    • 预处理指令详解
  • 第2章 基本语法与类型系统

    • 变量与基本类型
    • 类型转换
    • 枚举类型
    • 引用与指针
    • 数组与 stdarray
    • 字符串与原始字符串字面量
    • const 与 constexpr
    • nullptr 与空指针
    • 类型推导 auto 与 decltype
    • 基于范围的 for 循环
    • 值类别全面解析
    • char16_t 与 char32_t
    • static_assert 编译期断言
  • 第3章 函数与重载

    • 函数声明与定义
    • 函数重载
    • 默认参数与内联函数
    • Lambda 表达式
    • 函数对象与 stdfunction
    • 后置返回类型与 noexcept
  • 第4章 类与对象

    • 类的基本定义
    • 构造函数与析构函数
    • 拷贝控制
    • 移动构造函数与移动赋值
    • 列表初始化与类内初始化器
    • 静态成员与嵌套类
    • 友元
    • =default 与 =delete
  • 第5章 继承与多态

    • 继承基础
    • 虚函数与多态
    • 虚函数表与动态绑定原理
    • 虚析构函数
    • 抽象类与纯虚函数
    • 多重继承与虚继承
    • 继承构造函数
  • 第6章 运算符重载

    • 运算符重载基础
    • 算术与关系运算符重载
    • 赋值与移动运算符重载
    • 特殊运算符重载
  • 第7章 模板与泛型编程

    • 函数模板
    • 类模板
    • 模板特化与偏特化
    • 可变参数模板
    • 别名模板与模板模板参数
    • SFINAE 与类型萃取
    • 依赖名与 typename/template 关键字
  • 第8章 异常处理

    • 异常处理机制
    • noexcept 与异常安全
    • RAII 与异常安全实践
  • 第9章 内存管理与智能指针

    • 动态内存与内存分区
    • RAII 惯用法
    • unique_ptr
    • shared_ptr 与 weak_ptr
    • 内存管理最佳实践
  • 第10章 右值引用与移动语义

    • 右值引用与值类别深度解析
    • std::move 原理与使用
    • 完美转发与 std::forward
    • 移动语义性能对比与最佳实践
  • 第11章 STL容器

    • vector 深度剖析
    • deque 内部机制
    • list 与 forward_list
    • map 与 set 深度解析
    • unordered 容器与哈希原理
    • array 与 tuple
    • 容器适配器
    • 容器选择全景指南
  • 第12章 STL算法与迭代器

    • 迭代器体系全解
    • 非变异算法
    • 变异算法
    • 排序与二分算法
    • Lambda 与算法组合
    • std::random 随机数库
    • 自定义迭代器开发
  • 第13章 IO流与文件

    • 标准 IO 流
    • 格式化输出控制
    • 文件流操作
    • 字符串流
    • std::regex 正则表达式
  • 第14章 并发与多线程

    • thread 基础与线程管理
    • mutex 与 lock_guard
    • unique_lock 与 condition_variable
    • thread_local 线程局部存储
    • atomic 与内存序
    • future 与 async 异步编程
    • std::chrono 时间库
  • 第15章 现代C++新特性

    • 从 C++11 到 C++20 演进路线
    • C++14 关键新特性
    • C++17 关键新特性
    • C++20 核心特性速览
  • 第16章 面试考点与最佳实践

    • C++ 综合最佳实践清单
    • 高频面试题精讲
    • 多线程面试题与实战
    • 内存管理常见陷阱与排查
  • 附录

    • C++ 核心知识点
    • C++ 专业术语

从 C++11 到 C++20 演进路线

定义与作用

现代 C++ 始于 C++11,经历了 C++14(增量修复)、C++17(质量提升)和 C++20(范式变革)三个里程碑。理解演进路线有助于选择合适标准、规划项目迁移。

核心原理

版本演进脉络

关键特性演进

完整示例

示例一:同一需求四代写法对比

场景说明:飞翔科技的用户查询系统,对比从 C++11 到 C++20 的进化。

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <map>

struct User {
    int id;
    std::string name;
    std::string role;
};

// ============================================================
// C++11 写法:手动迭代 + 显式类型
// ============================================================
namespace cpp11 {
    std::vector<User> findAdmins(const std::vector<User>& users) {
        std::vector<User> result;
        for (std::vector<User>::const_iterator it = users.begin();
             it != users.end(); ++it) {
            if (it->role == "Admin")
                result.push_back(*it);
        }
        return result;
    }

    void print(const std::vector<User>& users) {
        for (auto it = users.begin(); it != users.end(); ++it)
            std::cout << "  [" << it->id << "] " << it->name << "\n";
    }
}

// ============================================================
// C++14 写法:泛型 lambda + for-range
// ============================================================
namespace cpp14 {
    auto findAdmins(const std::vector<User>& users) {
        std::vector<User> result;
        std::copy_if(users.begin(), users.end(), std::back_inserter(result),
            [](const auto& u) { return u.role == "Admin"; });
        return result;
    }

    void print(const std::vector<User>& users) {
        for (const auto& u : users)
            std::cout << "  [" << u.id << "] " << u.name << "\n";
    }
}

// ============================================================
// C++17 写法:结构化绑定 + if 初始化
// ============================================================
namespace cpp17 {
    auto findAdmins(const std::vector<User>& users) {
        std::vector<User> result;
        std::copy_if(users.begin(), users.end(), std::back_inserter(result),
            [](const auto& u) { return u.role == "Admin"; });
        return result;
    }

    void print(const std::vector<User>& users) {
        for (const auto& [id, name, role] : users)  // 结构化绑定
            std::cout << "  [" << id << "] " << name
                      << (role == "Admin" ? " *" : "") << "\n";
    }
}

// ============================================================
// C++20 写法:Ranges + Concepts
// ============================================================
namespace cpp20 {
    auto findAdmins(const std::vector<User>& users) {
        return users
            | std::views::filter([](const auto& u) {
                return u.role == "Admin";
              })
            | std::ranges::to<std::vector<User>>();
    }

    void print(const std::vector<User>& users) {
        std::ranges::for_each(users, [](const auto& u) {
            std::cout << "  [" << u.id << "] " << u.name
                      << (u.role == "Admin" ? " *" : "") << "\n";
        });
    }
}

int main() {
    std::vector<User> users{
        {1, "大翔", "Admin"},
        {2, "白歌", "Developer"},
        {3, "孔蓝", "Admin"},
        {4, "小崔", "Developer"},
        {5, "黄俪", "Developer"},
    };

    std::cout << "=== 用户查询: C++11 → C++20 ===\n\n";

    std::cout << "所有用户:\n";
    cpp17::print(users);

    std::cout << "\n管理员:\n";
    auto admins11 = cpp11::findAdmins(users);
    auto admins14 = cpp14::findAdmins(users);
    auto admins17 = cpp17::findAdmins(users);
    auto admins20 = cpp20::findAdmins(users);

    std::cout << "  C++11: " << admins11.size() << " 人\n";
    std::cout << "  C++14: " << admins14.size() << " 人\n";
    std::cout << "  C++17: " << admins17.size() << " 人\n";
    std::cout << "  C++20: " << admins20.size() << " 人\n";
}

示例二:版本特性速查表

特性C++11C++14C++17C++20
类型推导auto/decltypedecltype(auto)CTADauto 参数
Lambda基础泛型/初始化捕获constexpr模板语法
智能指针unique/shared/weakmake_unique—atomic<shared_ptr>
编译期constexpr 单句constexpr 多句if constexprconsteval/constinit
容器array/forward_list—string_viewspan
类型安全enum class—variant/optional/anyConcepts
算法<algorithm>—平行算法Ranges
并发thread/mutex/async共享锁平行 STLjthread/协程
比较———<=>
格式化iostream——std::format
模块———Modules

迁移策略

版本迁移路径

迁移建议

  1. 不急于升级编译器:先用当前标准的新特性,逐步准备
  2. 从低风险项开始:nullptr、auto、override、range-for
  3. 逐步引入智能指针:替换裸 new/delete,消除泄漏风险
  4. 利用可选类型:optional/variant 替代魔法值和 union
  5. Concepts 最后引入:需要编译器支持,且 API 设计层面改动

易错场景与面试考点

易错场景

1. 错误的标准选择

// C++17 项目:用了 C++20 的 ranges
auto result = vec | std::views::filter(pred);  // ❌ C++17 不可用

// 应使用 C++17 兼容写法
std::vector<int> result;
std::copy_if(vec.begin(), vec.end(),
             std::back_inserter(result), pred);

2. CTAD 的陷阱

std::vector v{1, 2, 3};         // vector<int>
std::vector v2(v.begin(), v.end());  // ❌ vector<std::vector<int>::iterator>
// 正确:std::vector<int> v2(v.begin(), v.end());

面试考点

考点要点
C++11 最大贡献移动语义、auto、lambda、并发库
C++14 定位增量修复,填补 C++11 缺失
C++17 亮点结构化绑定、optional/variant、if constexpr
C++20 四大支柱Concepts、Ranges、协程、Modules
新旧对比用户查询、资源管理等场景的各版本写法
迁移顺序低风险(nullptr/auto)→ 中风险(智能指针)→ 高风险(Concepts)
标准版本宏__cplusplus:201103L / 201402L / 201703L / 202002L
下一页
C++14 关键新特性