C++11 新特性(现在已经不新了)

auto关键字:编译器根据初始值自动推导出类型,但是不能用于函数传参以及数组类型的推导,这是编译器在编译阶段完成的,没有改变C++是静态语言的事实。

  • auto 是值类型
  • auto 一般会忽略顶层const,请显式的指定const autos
  • auto& 是左值引用类型
  • auto&& 是转发引用(可以是左值引用,也可以是右值引用)
  • 但如果想根据表达式获得对应的值类别,C++14可以使用decltype(auto) a = expr;,之前只能使用啰嗦地decltyp(expr) a = expr;

nullptr:一种特殊的空指针类型,能转换成其他任意类型的指针,而NULL一般被宏定义为0,遇到重载时可能会出现问题

decltype:查询表达式的类型,不会对表达式求值,经常与auto配合追踪函数的返回值类型,

  • decltype可返回表达式所表示类型(包括顶层const与引用)
  • decltype((variable))的结果永远是引用,而decltype(variable)的结果只有当variable本身是引用时才是引用

尾置返回类型: auto func(int i) -> int(*)[10]; 返回值是一个指针,指向含有10个整数的数组,这种写法要不普通函数返回函数指针要清晰很多

no except:对于某个函数,保证不抛出异常,可以给编译器更大的优化空间。

基于范围的for循环: for(auto &v : vec){...}

初始化列表:使用初始化列表来对类进行初始化,initializer_list

类成员默认初始化,class A int m_data{0}; ...}

constexpr,constexpr表示编译期常量,const用来表示一个运行时常量

匿名函数 Lambda: [capture list] (params list) mutable exception-> return type { function body },值捕获、引用捕获、隐式捕获

智能指针:新增了shared_ptr、unique_ptr、weak_ptr,用于解决内存管理的问题

可变参数模板:对参数进行了高度泛化,能表示0到任意个数、任意类型的参数,template <class... T> void f(T... args);

右值引用:基于右值引用可以实现移动语义和完美转发,消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率

新增正则表达式库

新增STL容器array以及tuple

新增自定义字面量,以前只能是原生类型的字面值常量,现在可以用operator””后缀

C++20新特性

Concepts,概念,对模板进行约束

Coroutine,协程,协作式的交叉调度执行,场景:生成器、异步I/O、惰性求值、事件驱动应用

Ranges,范围,不用begin()与end()来包围了

目的是使C++语言对于开发者友好,开发者可以把更多的经历投入到其他开发领域去,而不是纠结编写晦涩难懂的或者是炫技般的C++代码

C++23 新特性

std::expected:当前的常用方式是通过错误码或异常,但使用起来还是多有不便。std::expected<T, E>表示期望,算是std::variant和std::optional的结合,它要么保留T(期望的类型),要么保留E(错误的类型),它的接口又和std::optional相似。

Multidimensional Arrays: 多维数组可以用m[1,2]来访问,而不是m[1][2]

std::print(): 随着Formatting Library加入C++20,已在fmt库中使用多年的fmt::print()加入标准也是顺理成章。比count更快,格式化支持更友好

Formatting Ranges:格式化输出ranges,优化C++代码,能像python一样写print("how you doing".split(" "))

string, string_view 新增 contains 函数,直接判断是否有对应子串

std::unreachabl: 当我们知道某个位置是不可能执行到,而编译器不知道时,使用std::unreachalbe可以告诉编译器,从而避免没必要的运行期检查。

1
2
3
4
5
6
7
8
9
10
 2    switch (a) {
3 case 1:
4 // do something
5 break;
6 case 2:
7 // do something
8 break;
9 default:
10 std::unreachable();
11 }