最近,ISO C ++语言标准化委员会(是的,有一个)批准了国际标准“ C ++ 20”。GCC,Clang和Microsoft Visual C ++编译器支持该规范中提供的功能。另外,在Boost项目中实现了支持“ C ++ 20”的标准库。
下一步是准备发布文档。然后,将在11月初将最终版本发送给ISO,之后将以正式名称ISO / IEC 14882:2020发布。该委员会已经在研究下一个标准C ++ 23(C ++ 2b)。切入-具有代码示例的“ C ++ 20”功能。
什么是新的?
该委员会增加了模板模板扩展“ concepts”,使您可以定义模板参数的一组要求。在编译时,它们约束可以接受为模板参数的参数集。这些概念使得可以避免在模板内部使用的数据类型的属性与输入参数的数据类型的属性之间的逻辑不一致。
template<typename T>
concept EqualityComparable = requires(T a, T b) {
{ a == b } -> std::boolean;
{ a != b } -> std::boolean;
};
接受的扩展以使用模块。可以使用它们代替头文件。模块提供了一种基于组件边界的定义来组织源的新方法,而无需使用“ #include”包含头文件。
添加了__VA_OPT__宏,用于可变参数宏的自适应扩展,具体取决于可变参数中标记的存在。
添加了对<=>运算符的支持,以进行三向比较。
支持位字段的默认元素初始化程序。
添加了捕获lambda表达式的功能*这。
struct int_value {
int n = 0;
auto getter_fn() {
// BAD:
// return [=]() { return n; };
// GOOD:
return [=, *this]() { return n; };
}
};
现在,类可以使用无类型模板参数。
struct foo {
foo() = default;
constexpr foo(int) {}
};
template <foo f>
auto get_foo() {
return f;
}
get_foo(); // uses implicit constructor
get_foo<foo{123}>();
现在,您可以在模板参数中使用字符串文字。支持C样式的初始化语法。默认情况下,初始化未在字段初始化列表中明确列出的那些对象。
struct A {
int x;
int y;
int z = 123;
};
A a {.x = 1, .z = 2}; // a.x == 1, a.y == 0, a.z == 2
支持数据结构的空成员。
支持可能和不太可能的属性,以告知优化器条件构造被触发的可能性(“ [[likely]] if(random> 0){”)。
现在您可以使用范围在for循环中初始化变量值
for (auto v = std::vector{1, 2, 3}; auto& e : v) {
支持立即函数,该函数只能与常量一起使用。
consteval int sqr(int n) {
return n * n;
}
constexpr int r = sqr(100); // OK
int x = 100;
int r2 = sqr(x); // ERROR: 'x'
添加到库中:
- 支持UTF-8字符串的char8_t类型。
- 标头位(位操作)和版本。
- 检查字符串的前缀和后缀(starts_with,ends_with)的能力。
- 特征std :: remove_cvref,std :: unwrap_reference,std :: unwrap_decay_ref,std :: is_nothrow_convertible和std :: type_identity。
- 函数std ::中点,std :: lerp,std :: bind_front,std :: source_location,std :: visit,std :: is_constant_evaluated和std ::假设对齐。
- 支持std :: make_shared中的数组。
- std :: to_array函数,用于将类似数组的对象转换为std :: array。
现在,枚举语法更加方便:
enum class rgba_color_channel { red, green, blue, alpha };
std::string_view to_string(rgba_color_channel my_channel) {
switch (my_channel) {
using enum rgba_color_channel;
case red: return "red";
case green: return "green";
case blue: return "blue";
case alpha: return "alpha";
}
}
禁止在索引中使用运算符“,”(“ a [b,c]”)。不支持对使用violation关键字声明的变量进行的大多数操作,包括对标准类型的禁止的++和-操作。