C++17 好用特性
从 C++11
到 C++14
和 C++17
的部分实用特性:
lambda 的泛型参数和捕获的增强。
允许 lambda 函数的形式参数声明中使用 auto
。
1 | auto lambda = [](auto x, auto y) { return x + y; }; |
允许 lambda 函数的捕获部分中定义变量同时初始化。
1 | int a = 1, b = 2, c = 3; |
允许成员函数中的 lambda 函数以拷贝的方式捕获 *this
。
1 | struct node { int value; void func(); }; |
函数返回类型推导。
C++11
允许 lambda 函数返回值使用 auto
,C++14
允许一般函数也可以这样做,甚至可以递归,但递归调用必须在函数定义中的至少一个 return
语句之后。
1 | auto factorial(int n) { |
错误示例:
1 | auto factorial(int n) { |
构造函数模板推导
构造一个模板类对象不需要指明模板参数。
1 | pair a(1, 2.2); |
结构化绑定
将结构体拆包,相当于 C++11
中 tie
函数的增强。
1 | vector a{pair(1, 2), pair(2, 3)}; |
if
语句初始化
if
可以像 for
循环一样有一条初始化语句。
1 | if(int value = func(); value < 100) cout << value; |
二进制字面量和其他新增标准字面量
数字可以使用二进制形式指定,其格式使用前缀 0b
或 0B
。
在一个字符串后加 s
,表示 string
类型。
在一个数字后加 i
,if
,il
分别表示 complex<double>
、complex<float>
和 complex<long double>
复数类型。
1 | auto str = "hello world"s; // string |
折叠表达式
可以用来方便的定义参数个数不定的函数。
1 | template<class ...T> auto sum(T ...value) { return value + ...; } |
namespace 嵌套
1 | namespace A { |
字符串转化
from_chars
是把 const char*
转化成整数或浮点数。
to_chars
是把整数或浮点数转化成 const char*
。