各版本新特性¶
C++11¶
- Lambda 表达式
- 自动类型推导(auto)
- 基于范围的 for 循环
- 尾返回类型
- 右值引用和移动语义
- 统一的初始化语法
- 类成员初始化
- 构造函数委托
- 默认和删除的函数
- 继承构造函数
- 强类型枚举
- constexpr 关键字
- 类型别名模板
- 可变参数模板
- noexcept 关键字
- 显式类型转换运算符
- 字符串字面量和原始字符串字面量
- 用户定义的字面量
- 线程支持库
- 智能指针(shared_ptr, unique_ptr)
- 弱指针(weak_ptr)
- std::function 和 std::bind
- std::tuple
- std::array
- 无序容器(unordered_map, unordered_set 等)
- 正则表达式库
- std::chrono 时间库
- 对齐支持(alignas, alignof)
- nullptr 关键字
- 类型推导的 decltype 关键字
- 静态断言(static_assert)
- std::forward_list 单向链表容器
- 改进的插入器和提取器(std::put_time, std::get_time 等)
- 并行算法库(
、 ) - 随机数库(
) - 新的数值类型(int64_t、uint64_t 等)
- 常量表达式 if 语句(if constexpr)
C++14¶
- 二进制字面量:C++14 允许您直接使用二进制字面量表示整数,例如:
int binary_number = 0b1101; // 13 in decimal
- 泛型 lambda:C++14 支持泛型 lambda 表达式,这使您能够编写可以接受任何类型参数的 lambda 函数:
auto generic_lambda = [](auto x, auto y) { return x + y; };
- 变量模板:C++14 引入了变量模板,这允许您为变量定义模板,从而简化元编程:
template<typename T>
constexpr T pi = T(3.1415926535897932385);
- 返回类型推导:C++14 引入了函数的返回类型推导,使得编译器可以根据函数体自动推断返回类型,而无需显式指定:
auto add(int x, int y) {
return x + y;
}
- constexpr 的扩展:C++14 放宽了 constexpr 函数的限制,允许它们包含更多类型的语句,例如局部变量和多个返回语句。这使得 constexpr 函数更易于编写和维护。
- std::make_unique:C++14 在标准库中引入了 std::make_unique,用于创建 unique_ptr 实例,从而简化内存管理并避免潜在的内存泄漏:
auto ptr = std::make_unique<int[]>(5); // Creates an array of 5 integers
- std::integer_sequence:C++14 引入了 std::integer_sequence 及其相关类型,这有助于进行编译时整数序列操作。
- 更多的类型特征:C++14 增加了新的类型特征和编译时实用功能,例如 std::enable_if_t, std::remove_reference_t 和 std::result_of_t 等。
- 引入了 [[deprecated]] 属性:C++14 引入了一个新的属性 [[deprecated]],用于将某些代码标记为不推荐使用。这有助于开发者在代码中显示警告,提醒其他开发者不要使用被标记的部分:
[[deprecated("Use the new_function instead.")]]
void old_function() {
// ...
}
- 大括号初始化器的推导:C++14 允许在 auto 类型推导中使用大括号初始化器,使得代码更具可读性:
auto x{42}; // 'x' will be deduced as 'int'
- constexpr lambda:C++14 支持将 lambda 表达式声明为 constexpr,这意味着它们可以在编译时计算:
constexpr auto square = [](int x) { return x * x; };
- 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
- 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
- std::quoted:C++14 引入了 std::quoted,一个用于处理带引号的字符串的实用工具,便于在输入和输出时处理带引号的字符串:
std::string text = "Hello, world!";
std::stringstream ss;
ss << std::quoted(text);
- 数字分隔符:C++14 支持使用撇号(')作为数字分隔符,提高数字字面量的可读性:
int large_number = 1'000'000; // One million
- 聚合类的继承:C++14 允许使用聚合类的继承,这使得基类的初始化变得更简单:
struct Base {
int x;
};
struct Derived : Base {
int y;
};
Derived d{{1}, 2}; // Initializes 'x' to 1 and 'y' to 2
- 空指针常量转换:C++14 允许将整数常量表达式转换为 nullptr_t 类型的空指针常量,例如:
constexpr std::nullptr_t np = static_cast<std::nullptr_t>(0);
-
宽松的 constexpr 函数要求:C++14 放宽了 constexpr 函数的要求,允许它们包含更多类型的语句,例如局部变量和多个 return 语句。
-
更好地处理未定义行为:C++14 引入了一些更清晰的规则来处理未定义行为,以减少可能导致程序错误的风险。
-
变量初始化:C++14 引入了一些对变量初始化的改进,例如允许更简洁地初始化成员变量,这使得代码更容易阅读和编写。
C++17¶
- 结构化绑定(Structured Bindings)
- if constexpr
- 类模板参数自动推导(Class Template Argument Deduction)
- std::variant
- 带有初始化器的 if 和 switch 语句
- 内联变量(Inline Variables)
- 多个模板参数列表
- 折叠表达式(Fold Expressions)
- std::any
- std::optional
- std::byte
- std::filesystem
- std::string_view
- std::invoke
- std::apply
- constexpr Lambda
- 复合赋值语句中的 constexpr
- std::allocator_traits
- 并行算法(Parallel Algorithms)
- 无序容器的节点句柄
- 更多的 constexpr 容器操作
- 异常规格(Exception Specifications)转换为类型系统的一部分(noexcept 规范)
- 新的属性:[[nodiscard]], [[maybe_unused]], [[fallthrough]]
- Lambda 表达式中的
*this
捕获 - 模板参数推导的类型别名(Alias Template Argument Deduction)
- 使用
auto
的 non-type 模板参数 - 模板参数值的默认实参
- 嵌套命名空间定义
- constexpr 中的 if 语句
- 聚合体类型的完善(Aggregate Type Improvements)
C++20¶
- 概念 (Concepts)
- 范围 (Ranges)
- 协程 (Coroutines)
- 三元组比较 (Three-way comparison)
- 带有模板的 Lambda 表达式
constexpr
新增功能- 模块 (Modules)
- 新的标准属性
std::span
std::jthread
constinit
关键字std::is_constant_evaluated()
std::source_location
std::midpoint
和std::lerp
- 透明的表达式求值
- 条件
explicit
- 改进的
struct
绑定 - 对于虚基类的默认成员函数
- 包含指针(pointer-to-member)
std::ssize()
std::bit_cast
<bit>
头文件- 数学常数的定义
std::polymorphic_allocator
std::atomic_ref
std::remove_cvref
- 字面量运算符模板
- 通过
consteval
实现的立即函数 - 更改了
aggregate
的定义 - 嵌套的内联命名空间
- 基于范围的
for
循环的初始化语句 std::allocator
改进- 更改了 Lambdas 默认捕获模式的行为