需要记忆的(面试六脉神剑)
-
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 (T thing = foo(); auto& x : thing.items()) { /* ... */ } // OK
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()