modern
-
对齐:一个结构体中的所有元素所占的空间大小都会按其中最大的类型所占的空间大小,不到的部分空字节填充。
alignof()获取某一个类型的对齐大小
alignas(int)让某一个类型的大小对齐int大小,写在变量名前
-
static_assert(bool,string/c_str)
编译时assert
-
变量模板
就是将一个变量的类型变为模板
1
2
3
4template<typename T>
T val;
//使用的时候
val<某个type>=... -
泛型lambda
支持模板化
-
interger_sequence<T,number1,number2,…>
一个类型为T,值为number的整数序列,一般用于模板元编程
make_interger_sequence<T,number>生成一个0-19的interger_sequence
make_interger_index
类型为size_t -
std::exchange(obj,new_value)
以new_value替换obj的值并返回obj的旧值
-
std::quoted(字符串),给暂时的字符串加上””,可以用来简化生成JSON、XML等带引号的文本格式的代码。
std::quoted(in, delim, escape),delim是要加上的字符,而如果原字符串中有delim字符,那么在前面加上escape以实现转义。
-
结构化绑定(都需要大小一致)
- 绑定数组,第一个绑定a[0]….,必须要绑定的数量和数组大小一致
- 绑定元组
- 绑定结构体,按声明顺序一一绑定
-
if中初始化:if(初始化;条件){}初始化的变量的生命周期是整个if
-
复制消除
有的时候编译器会省略一些复制构造和移动构造直接使用原本的变量来作为新的变量来省去这一开销。
而c++17中引入了一部分的强制复制消除的规则,原本都是非强制的。
-
折叠表达式
通过折叠表达式来原地展开来简化形参包的使用。
-
模板类型(c++20还有非类型的)推导,即有些能推导的地方就不用写<>了
-
非类型模板参数的类型也可以用auto来推导了
-
using可以一次性using多个变量了,用,隔开。
-
属性说明符列表可以将命名空间提前。
-
[[fallthrough]]
在一个case结束时不break不会警告
-
std::any,一个可以为任何类型的类型,但是要获取对应值的时候要进行any_cast转为特定的类型后才能访问。
-
charconv:from_chars(char*,char*,数字&,chars_format)和to_chars(char*,char*,数字,char_format),from_chars返回值通过引用传递,提供了更好的字符串和数字转换(可以调整格式)
-
excution:提供seq顺序,par按顺序并行,par_unseq乱序并行,unseq乱序四种方法。一般用于for_each(策略,iter,iter,函数),表示以什么样的策略对iter范围的数据执行这个函数。
-
filesystem:提供filesystem和path来处理文件系统和路径。
-
optional:提供一种可选值类型,当被默认初始化或者另一个空的optional赋值时为空。可以通过reset来清空值。当转换为bool或者调用has_value的时候返回是否含有值的bool。
-
string_view:一个只读的只持有指针和大小不持有空间的字符串。
字符串视图有两个主要的应用:
你可能已经分配或者映射了字符序列或者字符串的数据,并且想在不分配更多内存的情况下使用这些数据。典型的例子是内存映射文件或者处理长文本的子串。
你可能想提升接收字符串为参数并以只读方式使用它们的函数/操作的性能,且这些函数/操作不需要结尾有空字符。
-
variant:通过get
(变量)来获取值,通过holds_alternative (变量)或者变量.index()来判断持有类型。比union更加安全,自动内存管理,取错误的类型会报错。 -
std::apply(func,tuple):将tuple作为形参列表给func运行
-
make_from_tuple
(tuple)和std::apply(T(),tuple)功能差不多。 -
std::search(iter,iter,iter,iter):在区间1搜索区间2
-
std::search(iter,iter,searcher(iter,iter)):在区间1中以某种特定的搜索方法搜索区间2,有default_searcher和boyer_moore_searcher
-
as_const能够避免使用const_cast
-
std::not_fn(func):将func的功能取反,一般如将返回的bool取反之类的?
-
std::gcd,std::lcm
-
std::launder:主要是用来帮助辅助编译器来解决一些别名的问题,如别名所指向的失效的问题,这个时候就需要实际进行访问真正的内存情况
-
功能特性测试:由于编译器可能不支持c++的所有规定的特性,因此,可以使用功能特性测试提供的一系列宏来测试,并根据结果来适配不同的版本
-
<=>:三路比较运算符,可重载,要求在a<b时<0,a>b时>0,a=b时=0.
-
默认比较函数:当将三路比较运算符设为=default时就会生成默认比较函数.
-
struct和union的指派初始化器:{.元素=值,…}要按声明顺序,并且union只能初始化一个
-
如if和switch一样,for(:)时也能进行初始化for(定义;:),以更方便使用for。定义可以为别名声明,也可以时普通定义。
-
[[likely]][[unlikely]]:分支时使用,用于编译时优化
-
**[[no_unique_address]]:**若该成员非空,则其中的任何尾随填充空间亦可复用于存储其他数据成员。
-
consteval:只在编译期执行,必须返回常量,使用条件比constexpr更严格。
- source_location:提供行数,列数,文件名和所在函数的名字
- ranges:一个新的库,表示一个范围(通过首迭代器和喂迭代器来确定一个范围),各种std都实现了参数为ranges而非迭代器的重载。
- 用户自定义operator:operator””名字,所有用户定义的名字必须以_开头,而标准库中的则不需要。允许的形参为long double,unsigend long long,各种字符类型,各种字符串(char*),并且对于字符串指针可以有第二个形参size_t类型,表示这个字符串的长度。使用的时候直接在后加上这个名字即可。
- noexcept在新标准中也已经是函数类型的一部分了。
- span:也是一个视图
- ranges:就是给算法加上了require约束