Skip to content

各版本新特性

C++11

  1. Lambda 表达式
  2. 自动类型推导(auto)
  3. 基于范围的 for 循环
  4. 尾返回类型
  5. 右值引用和移动语义
  6. 统一的初始化语法
  7. 类成员初始化
  8. 构造函数委托
  9. 默认和删除的函数
  10. 继承构造函数
  11. 强类型枚举
  12. constexpr 关键字
  13. 类型别名模板
  14. 可变参数模板
  15. noexcept 关键字
  16. 显式类型转换运算符
  17. 字符串字面量和原始字符串字面量
  18. 用户定义的字面量
  19. 线程支持库
  20. 智能指针(shared_ptr, unique_ptr)
  21. 弱指针(weak_ptr)
  22. std::function 和 std::bind
  23. std::tuple
  24. std::array
  25. 无序容器(unordered_map, unordered_set 等)
  26. 正则表达式库
  27. std::chrono 时间库
  28. 对齐支持(alignas, alignof)
  29. nullptr 关键字
  30. 类型推导的 decltype 关键字
  31. 静态断言(static_assert)
  32. std::forward_list 单向链表容器
  33. 改进的插入器和提取器(std::put_time, std::get_time 等)
  34. 并行算法库(
  35. 随机数库(
  36. 新的数值类型(int64_t、uint64_t 等)
  37. 常量表达式 if 语句(if constexpr)

C++14

  1. 二进制字面量:C++14 允许您直接使用二进制字面量表示整数,例如:
int binary_number = 0b1101; // 13 in decimal
  1. 泛型 lambda:C++14 支持泛型 lambda 表达式,这使您能够编写可以接受任何类型参数的 lambda 函数:
auto generic_lambda = [](auto x, auto y) { return x + y; };
  1. 变量模板:C++14 引入了变量模板,这允许您为变量定义模板,从而简化元编程:
template<typename T>
constexpr T pi = T(3.1415926535897932385);
  1. 返回类型推导:C++14 引入了函数的返回类型推导,使得编译器可以根据函数体自动推断返回类型,而无需显式指定:
auto add(int x, int y) {
    return x + y;
}
  1. constexpr 的扩展:C++14 放宽了 constexpr 函数的限制,允许它们包含更多类型的语句,例如局部变量和多个返回语句。这使得 constexpr 函数更易于编写和维护。
  2. std::make_unique:C++14 在标准库中引入了 std::make_unique,用于创建 unique_ptr 实例,从而简化内存管理并避免潜在的内存泄漏:
auto ptr = std::make_unique<int[]>(5); // Creates an array of 5 integers
  1. std::integer_sequence:C++14 引入了 std::integer_sequence 及其相关类型,这有助于进行编译时整数序列操作。
  2. 更多的类型特征:C++14 增加了新的类型特征和编译时实用功能,例如 std::enable_if_t, std::remove_reference_t 和 std::result_of_t 等。
  3. 引入了 [[deprecated]] 属性:C++14 引入了一个新的属性 [[deprecated]],用于将某些代码标记为不推荐使用。这有助于开发者在代码中显示警告,提醒其他开发者不要使用被标记的部分:
[[deprecated("Use the new_function instead.")]]
void old_function() {
    // ...
}
  1. 大括号初始化器的推导:C++14 允许在 auto 类型推导中使用大括号初始化器,使得代码更具可读性:
auto x{42}; // 'x' will be deduced as 'int'
  1. constexpr lambda:C++14 支持将 lambda 表达式声明为 constexpr,这意味着它们可以在编译时计算:
constexpr auto square = [](int x) { return x * x; };
  1. std::exchange:C++14 引入了一个新的实用函数 std::exchange,它可以原子地替换一个对象的值并返回旧值:
int a = 1;
int b = 2;
a = std::exchange(b, a); // 'a' is set to 2, and 'b' is set to 1
  1. cbegin/cend 和 rbegin/rend 成员函数:C++14 引入了非成员函数 cbegin/cend 和 rbegin/rend 的对应成员函数版本,它们返回容器的常量迭代器或反向迭代器:
std::vector<int> v = {1, 2, 3};
auto it = v.cbegin(); // Returns a const_iterator
  1. std::quoted:C++14 引入了 std::quoted,一个用于处理带引号的字符串的实用工具,便于在输入和输出时处理带引号的字符串:
std::string text = "Hello, world!";
std::stringstream ss;
ss << std::quoted(text);
  1. 数字分隔符:C++14 支持使用撇号(')作为数字分隔符,提高数字字面量的可读性:
int large_number = 1'000'000; // One million
  1. 聚合类的继承:C++14 允许使用聚合类的继承,这使得基类的初始化变得更简单:
struct Base {
    int x;
};

struct Derived : Base {
    int y;
};

Derived d{{1}, 2}; // Initializes 'x' to 1 and 'y' to 2
  1. 空指针常量转换:C++14 允许将整数常量表达式转换为 nullptr_t 类型的空指针常量,例如:
constexpr std::nullptr_t np = static_cast<std::nullptr_t>(0);
  1. 宽松的 constexpr 函数要求:C++14 放宽了 constexpr 函数的要求,允许它们包含更多类型的语句,例如局部变量和多个 return 语句。

  2. 更好地处理未定义行为:C++14 引入了一些更清晰的规则来处理未定义行为,以减少可能导致程序错误的风险。

  3. 变量初始化:C++14 引入了一些对变量初始化的改进,例如允许更简洁地初始化成员变量,这使得代码更容易阅读和编写。

C++17

  1. 结构化绑定(Structured Bindings)
  2. if constexpr
  3. 类模板参数自动推导(Class Template Argument Deduction)
  4. std::variant
  5. 带有初始化器的 if 和 switch 语句
  6. 内联变量(Inline Variables)
  7. 多个模板参数列表
  8. 折叠表达式(Fold Expressions)
  9. std::any
  10. std::optional
  11. std::byte
  12. std::filesystem
  13. std::string_view
  14. std::invoke
  15. std::apply
  16. constexpr Lambda
  17. 复合赋值语句中的 constexpr
  18. std::allocator_traits
  19. 并行算法(Parallel Algorithms)
  20. 无序容器的节点句柄
  21. 更多的 constexpr 容器操作
  22. 异常规格(Exception Specifications)转换为类型系统的一部分(noexcept 规范)
  23. 新的属性:[[nodiscard]], [[maybe_unused]], [[fallthrough]]
  24. Lambda 表达式中的 *this 捕获
  25. 模板参数推导的类型别名(Alias Template Argument Deduction)
  26. 使用 auto 的 non-type 模板参数
  27. 模板参数值的默认实参
  28. 嵌套命名空间定义
  29. constexpr 中的 if 语句
  30. 聚合体类型的完善(Aggregate Type Improvements)

C++20

  1. 概念 (Concepts)
  2. 范围 (Ranges)
  3. 协程 (Coroutines)
  4. 三元组比较 (Three-way comparison)
  5. 带有模板的 Lambda 表达式
  6. constexpr 新增功能
  7. 模块 (Modules)
  8. 新的标准属性
  9. std::span
  10. std::jthread
  11. constinit 关键字
  12. std::is_constant_evaluated()
  13. std::source_location
  14. std::midpointstd::lerp
  15. 透明的表达式求值
  16. 条件 explicit
  17. 改进的 struct 绑定
  18. 对于虚基类的默认成员函数
  19. 包含指针(pointer-to-member)
  20. std::ssize()
  21. std::bit_cast
  22. <bit> 头文件
  23. 数学常数的定义
  24. std::polymorphic_allocator
  25. std::atomic_ref
  26. std::remove_cvref
  27. 字面量运算符模板
  28. 通过 consteval 实现的立即函数
  29. 更改了 aggregate 的定义
  30. 嵌套的内联命名空间
  31. 基于范围的 for 循环的初始化语句
  32. std::allocator 改进
  33. 更改了 Lambdas 默认捕获模式的行为