C++20 概述
Qt 6 正式要求使用 C++17,但我们一直在努力支持新的 C++ 语言特性,以使 Qt 运行更快、更安全,并为用户提供更好的体验。
本页面简要概述了 Qt 中可用的 C++20 特性。
WebEngine 和模块特定要求
虽然 Qt 6 通常仅要求使用兼容 C++17 的编译器,但 Qt WebEngine 该模块因其依赖项(如 Chromium)的缘故,需要 C++20 兼容的编译器。
如果您正在构建Qt WebEngine ,请确保您的编译器完全支持 C++20。
有关详细要求,请参阅《Qt WebEngine 平台说明》。
对std::chrono
各种与日期和时间相关的类都支持早期版本 C++ 中的std::chrono功能。随着 C++20 的推出,std::chrono 添加了新的日历类型(例如year_month_day),以及日期和时间表示形式(例如system_clock及其time_point类型)。 此外,它现在还提供了对 IANA时区相关信息数据库的访问。当 Qt 使用 C++20 进行构建时,即可利用这些新增功能。
QDate 此外,QDateTime 现已支持各种日历、日期及日期时间类型之间的相互转换,并新增了时长类型。QTimeZone 现支持通过time_zone 进行构造。
QTimeZone 此外,当启用timezone_tzdb 特性进行构建时,还可以使用 C++20 的tzdb功能来代替特定于平台的后端来访问时区信息。由于某些标准库的实现未能准确反映 IANA 的时区数据,因此在 Qt 6.9 中这仍处于实验阶段。
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++ 类型(如整数、浮点数和枚举类型)而言,作用类似于 C++17 版本的 `operator<=>() `。
Qt 还在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")]]
© 2026 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.