C++20 概述
Qt 6 正式要求使用 C++17,但我们一直在努力支持新的 C++ 语言特性,以使 Qt 更快、更安全,并为用户提供更好的体验。
本页简要概述了 Qt 中可用的 C++20 功能。
支持std::chrono
与日期和时间相关的各种类都支持旧版 C++ 中的std::chrono功能。随着 C++20 的到来,std::chrono
添加了新的日历类型,如year_month_day,以及日期和时间表示法,如system_clock及其time_point类型。现在,它还提供了对 IANA时区相关信息数据库的访问。在使用 C++20 构建 Qt 时,现在可以使用这些新增功能。
QDate QDateTime QTimeZone 现在支持从时区构造。
QTimeZone 当启用 功能时,Qt 6.0 还可以使用 C++20timezone_tzdb
tzdb设施代替特定平台的后端来访问时区信息。这在 Qt 6.9 中仍是试验性的,因为某些标准库实现并不能如实反映 IANA 时区数据。
QSpan - Qt 版本的std::span
std::span类模板是对标准库的一种补充,它提供了一种统一的方式来访问任何连续容器的连续部分。
在 Qt 的公共 API 中使用std::span
可以带来显著的优势。然而,Qt 6 只要求使用 C++17,这意味着它不能在 API 和 ABI 中使用 C++20 类型。
Qt 6.7 引入了QSpan -std::span
的 Qt 版本。该类的 API 与 std 版本兼容。QSpan 和std::span
可以相互隐式转换。不过,这两个类之间存在一些差异。详情请参见QSpan class documentation 中的相应章节。
三向比较操作符
C++20 引入了operator<=>()
,也称为三向比较运算符,并引入了三种排序类型来表示比较结果:
在 Qt 6.8 中,许多QtCore 类都获得了对operator<=>()
的支持。要使用新操作符,用户项目必须以 C++20 模式编译。
不过,从 Qt 6.7 开始,C++17 用户可以使用我们自己的等效std 排序类型。
作为 C++20 语言的一个特性,将operator<=>()
反向移植到 C++17 是不可能的,但您可以使用 Qt::compareThreeWay() 函数,它的作用就像 C++17 版本的operator<=>()
,用于内置的 C++ 类型(如整数、浮点和枚举类型)。
Qt XML 还为QtCore 中的各种类定义了辅助函数compareThreeWay()
。这些函数都是以隐藏好友的方式实现的。用户可以为自定义类型实现自己的compareThreeWay()
函数。
最后,Qt 提供了一个qCompareThreeWay() 函数模板,作为通用的三向比较实现。它的实现依赖于 Qt::compareThreeWay() 和上述免费的compareThreeWay()
函数。
其他重要功能
Qt 还采用了 C++20 的其他一些特性,例如
- Q_CONSTINIT 扩展到 C++20 关键字的宏,或扩展到编译器特定属性(如果有的话
constinit
- Q_NODISCARD_CTOR 如果编译器支持构造函数上的 属性,则扩展为 属性的宏
[[nodiscard]]
[[nodiscard]]
- Q_NODISCARD_X 和 宏Q_NODISCARD_CTOR_X
[[nodiscard("reason")]]
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.