跳转到内容

C++20

本页使用了标题或全文手工转换
维基百科,自由的百科全书

C++20,是继C++17之后的C++编程语言的ISO/IEC标准修订版的名称。[1]2020年2月,该标准在布拉格的会议上由WG21进行了技术定稿[2]。同年9月4日草案获得批准后,C++20同年12月正式發布。[3]相比 C++17,C++20引入了新的语言特性,如概念、模块、操作符“<=>”、协程、指定初始化、新标准属性等。C++20库标准还加入了范围、特性测试宏和位操作等。

特性改动

[编辑]

新增语言特性

[编辑]

功能特性测试

[编辑]

自C++11之后标准引入了大量的C++语言、库特性,在20标准前为了区分这些特性是否生效只能判断C++标准。20标准为这些语言和程序库的功能特性定义了一组预处理器宏,使之成为检测这些功能特性是否存在的一种简单且可移植的方式。测试宏展开会得到该语言、库特性添加到标准草案中的年份和月份,如果该特性有显著变更,宏展开的时间也为更新。

  • 属性测试宏
__has_cpp_attribute( 属性记号 )

宏函数,用以检测属性是否支持,如:

#if __has_cpp_attribute(nodiscard) > 201603L
#pragma message("nodiscard version is c++20")
#endif
  • 语言特性测试宏

用以检测当前某个语言功能特性是否支持,单个宏,如:

#if __cpp_concepts >= 201907L
#pragma message("support concepts")
#endif
  • 标准库特性测试宏

用以检测当前某个标准库特性是否支持,单个宏,不由编译器预定义,由<version>头文件定义:

#ifdef __cpp_lib_bitops
#pragma message("support bitops")
#endif

三路比较和比较操作符的默认

[编辑]

新增三路比较运算符,又称spaceship operator,其形式为:

左操作数 <=> 右操作数

表达式返回一个对象,使得

  • 如果 a < b,那么 (a <=> b) < 0
  • 如果 a > b,那么 (a <=> b) > 0
  • 而如果 a 和 b 相等/等价,那么 (a <=> b) == 0。

三路比较操作符会作为< <= > >=四个操作符的重写候选,若决议选择了带参数顺序的operator<=>,则对于操作如x @ y,执行 x <=> y @ 0,对于不带参数顺序的执行 0 @ x <=> y。

新增可以将比较操作符显式预置=default来要求编译器为某个类生成对应比较,比如:

struct Point
{
    int x;
    int y;
    auto operator<=>(const Point&) const = default;
};

聚合体指派初始化

[编辑]

聚合体初始化的语法糖,在c++11的聚合体初始化基础上,增加了可以指派具体值的语法:

struct U {
  int a;
  float b;
};

U u1{ 1, 2.0 };
U u2{ .a = 1, .b = 2.0 };


注释

[编辑]
  1. ^ The Standard : Standard C++. isocpp.org. [2020-09-08]. (原始内容存档于2020-09-19). 
  2. ^ C++ IS schedule (PDF). [2020-09-08]. (原始内容存档 (PDF)于2019-11-14). 
  3. ^ Current Status : Standard C++. isocpp.org. [2020-09-08]. (原始内容存档于2020-09-08). 

另见

[编辑]