C++20新增特性
in Cplusplus Pageviews
cplusplus语言特性
新增关键字
- concept
- requires
- constinit
- consteval
- co_await
- co_return
- co_yeild
- char8_t
模块
优点:
- 没有头文件;
- 声明实现仍然可分离,但非必要;
- 可以显式指定导出哪些类或函数;
- 不需头文件重复引入宏;
- 模块之间名称可以相同,并且不会冲突;
- 模块只处理一次,编译会更快(头文件每次引入都需要处理);
- 预处理宏只在模块内有效;
- 模块的引入与引入顺序无关;
Module Code
// export entirety
export namespace Test {
auto GetTestString() {
return "Welcome to C++20!";
}
template<typename T>
T Sum(T t)
{
return t;
}
template<typename T, typename ...Args>
T Sum(T t, Args ...args)
{
return t + Sum<T>(args...);
}
enum class ValueType : uint8_t {
Bool = 0,
Char,
Int,
Float,
Double,
};
template<typename T>
T GetType(ValueType type) {
switch (type)
{
using enum ValueType;
case Bool:
return true;
case Char:
return 'A';
case Int:
return 10;
case Float:
return 3.1415926;
case Double:
return 0.3333333;
}
return true;
}
}; // namespace Test
// export struct
export namespace StructTest {
struct Grade {
int val{0};
int level{3};
};
void AddValue(Grade &g, int num) {
g.val += num;
g.level += num;
}
};
// common export
export auto GetCommonString()
{
return "Welcome to learn C++20!";
}
auto GetCommonString()
{
return "Welcome to learn C++20!";
}
// export moudle x.y.z
export module c++20.test;
Main Code
import c++20.test;
int main()
{
auto ret1 = GetCommonString();
using namespace Test;
auto ret3 = GetTestString();
auto ret4 = Sum<int>(3, 4);
auto ret5 = Sum<double>(3.14, 0.5, 0.125);
auto ret6 = GetDateType<bool>(ValueType::Bool);
auto ret7 = GetDateType<int>(ValueType::Int);
auto ret8 = GetDateType<char>(ValueType::Char);
StructTest::Grade grade;
StructTest::AddValue(grade, 10);
std::cout << grade.val << " | " << grade.level << std::endl;
return 0;
}
Lambda表达式
- 允许
[=, this]
作为lambda捕获,并弃用隐式捕获[=]
; - lambda init-capture中的包扩展:
...args = [std::move(args)](){};
static
,thread_local
,和lambda
捕获结构化绑定;- 模板形式的
lambda
;
模板形式的lambda表达式
// before c++20 获取元素的类型
auto fun = [](auto vec) {
using T = typename decltype(vec)::value_type;
};
// C++20
auto fun = []<typename T>(vector<T> vec) {
//...
};
lambda表达式捕获支持打包展开
// Before C++20
template<class F, class... Args>
auto DelayInvoke(F f, Args... args) {
return [f, args...]() {
return std::invoke(f, args...);
};
}
// C++20
template<class F, class... Args>
auto DelayInvoke(F f, Args... args) {
return [f = std::move(f), args = std::move(args)...]() {
return std::invoke(f, args...);
};
}