C++20常用特性

需要记忆的(面试六脉神剑)

coroutine(协程)
特性测试宏
module(模块)
barrier/latch
semaphore
jthread

核心语言特性

  • 特性测试宏

__has_cpp_attribute( attribute-token )
该标准定义了一组预处理器宏,对应于c++ 11或更高版本中引入的语言特性或库特性。

  • <=>
  • 指定初始化

对于非联合聚合,当初始化式子句的数量小于成员数量时,未提供指定初始化式的元素将像上面描述的那样初始化(提供默认成员初始化式,否则为空列表初始化)。

struct A
{
    string str;
    int n = 42;
    int m = -1;
};
 
A{.m = 21} // Initializes str with {}, which calls the default constructor
           // then initializes n with = 42
           // then initializes m with = 21
  • 范围for循环支持初始化语句
for (T thing = foo(); auto& x : thing.items()) { /* ... */ } // OK
  • char8_t

UTF-8字符表示类型

  • 新增属性

no_unique_address:允许此数据成员与其类的其他非静态数据成员或基类子对象重叠。
likely/unlikely:允许编译器针对以下情况进行优化:包含该语句的执行路径比任何不包含该语句的执行路径更可能或更不可能

  • 聚合初始化支持{}

T object = { .des1 = arg1 , .des2 { arg2 } ... };
T object {.des1 = arg1 , .des2 { arg2 } ... };

  • coroutines

协程是一种可以挂起执行以便稍后恢复的函数。协程是无堆栈的:它们通过返回调用者来暂停执行,并且恢复执行所需的数据与堆栈分开存储。这允许异步执行的顺序代码(例如,在没有显式回调的情况下处理非阻塞I/O),还支持惰性计算无限序列和其他用途的算法。

  • modules(模块)
// helloworld.cpp
export module helloworld; // module declaration
 
import <iostream>;        // import declaration
 
export void hello()       // export declaration
{
    std::cout << "Hello world!\n";
}
// main.cpp
import helloworld; // import declaration
 
int main()
{
    hello();
}
  • 约束和概念

类模板、函数模板和非模板函数(通常是类模板的成员)可以与约束相关联,约束指定了对模板参数的要求,可用于选择最合适的函数重载和模板特殊化。
这种需求的命名集称为概念。每个概念都是一个谓词,在编译时计算,并成为模板接口的一部分,在那里它被用作约束。

#include <string>
#include <cstddef>
#include <concepts>
 
// Declaration of the concept "Hashable", which is satisfied by any type 'T'
// such that for values 'a' of type 'T', the expression std::hash<T>{}(a)
// compiles and its result is convertible to std::size_t
template<typename T>
concept Hashable = requires(T a)
{
    { std::hash<T>{}(a) } -> std::convertible_to<std::size_t>;
};
 
struct meow {};
 
// Constrained C++20 function template:
template<Hashable T>
void f(T) {}
//
// Alternative ways to apply the same constraint:
// template<typename T>
//     requires Hashable<T>
// void f(T) {}
//
// template<typename T>
// void f(T) requires Hashable<T> {}
//
// void f(Hashable auto /*parameterName*/) {}
 
int main()
{
    using std::operator""s;
 
    f("abc"s);    // OK, std::string satisfies Hashable
    // f(meow{}); // Error: meow does not satisfy Hashable
}

标准库特性

  • bit

基于bit的操作,包括bit_cast(转换类型),bit_ceil(获得不小于x的2的最小积分次幂),rotl(计算位按左旋转的结果),countl_zero(从最高位开始计算连续0位的个数),popcount(统计一个无符号整型的1位的个数),等等。

  • format

支持格式化字符串

  • numbers

提供许多数字常量,例如:numbers::pi和numbers::sqrt2

  • source_location

表示源代码信息的类,如文件名、行号和函数名

  • span

类模板span描述了一个对象,该对象可以引用一个连续的对象序列,该序列的第一个元素位于位置0。span可以具有静态范围(在这种情况下,序列中的元素数量在编译时已知并编码在类型中),也可以具有动态范围。

  • syncstream

包括同步输出设备包装器(basic_syncbuf),同步输出流包装器(basic_osyncstream)等

  • barrier

可重复使用的线程栅栏。

  • latch

一次性的线程栅栏

  • semaphore

信号量

  • stop_token

查询std::jthread取消请求的接口。stop_token类为其关联的std::stop_source对象提供了检查停止请求是否已经发出或可以发出的方法。它本质上是相关停止状态的线程安全“视图”。

  • 日历和时区

属于std::chrono

  • make_shared支持数组
  • jthread

jthread类表示一个执行线程。它具有与std::thread相同的一般行为,除了jthread在销毁时自动重新连接,并且在某些情况下可以取消/停止。

  • starts_with/ends_with

检查是否以某个字符串开头/结尾。

  • assume_aligned

通知实现ptr所指向的对象至少与N对齐。

  • bind_front

生成一个转发调用包装器,调用这个包装器相当于用它的第一个sizeof…(Args)参数绑定到Args来调用f。
std::bind_front(f, bound_args...)(call_args...)等价于std::invoke(f, bound_args..., call_args...)

  • c8rtomb/mbrtoc8

将单个码位从UTF-8转换为窄的多字节字符表示/将单个码位表示从窄的多字节字符转换为UTF-8

  • 无序容器支持异质查找

特性允许调用者传递任何类型的键(只要用户指定的comparator仿函数)。

  • execution::unseq
  • midpoint

计算整数、浮点数或指针a和b的中点

  • lerp

计算a和b之间的线性插值,如果参数t在[0,1]之内(否则为线性外推),则结果为a+t(b-a),需要考虑浮点计算不精确。

  • 统一的容器删除

erase/erase_if

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容