JEP 347:启用 C++14 语言功能
概括
允许在 JDK C++ 源代码中使用 C++14 语言功能,并给出有关哪些功能可以在 HotSpot 代码中使用的具体指导。
目标
通过 JDK 15,JDK 中 C++ 代码使用的语言功能已仅限于 C++98/03 语言标准。在 JDK 11 中,代码已更新以支持使用较新版本的 C++ 标准进行构建,尽管它尚未使用任何新功能。这包括能够使用支持 C++11/14 语言功能的各种编译器的最新版本进行构建。
此 JEP 的目的是正式允许 JDK 内的 C++ 源代码更改以利用 C++14 语言功能,并提供有关哪些功能可以在 HotSpot 代码中使用的具体指导。
非目标
此 JEP 不建议对 HotSpot 之外的 JDK 中的 C++ 代码进行任何用法或样式更改。 HotSpot 和非 HotSpot 代码的规则已经不同。例如,C++ 异常在某些非 HotSpot 代码中使用,但在 HotSpot 中构建时选项不允许使用。但是,构建一致性要求将使较新的语言功能可用于 JDK 中的所有 C++ 代码。
描述
构建系统的变化
为了利用 C++14 语言功能,需要进行一些构建时更改,具体情况取决于平台编译器。还需要指定各种平台编译器的最低可接受版本。应明确指定所需的语言标准;更高版本的编译器可能默认为更高版本且可能不兼容的语言标准。
-
Windows:JDK 11 需要 Visual Studio 2017。(早期版本将生成配置时警告,并且可能会或可能不会工作。)对于 Visual Studio 2017,默认 C++ 标准是 C++14。
/std:c++14
应添加该选项。对旧版本的支持将完全删除。 -
Linux:将
-std=gnu++98
编译器选项替换为-std=c++14
. gcc 的最低支持版本是 5.0。 -
macOS:将
-std=gnu++98
编译器选项替换为-std=c++14
. clang 的最低支持版本是 3.5。 -
AIX/PowerPC:将
-std=gnu++98
编译器选项替换为-std=c++14
并要求使用 xlclang++ 作为编译器。 xlclang++ 支持的最低版本是 16.1。
HotSpot 代码中 C++ 用法的更改
HotSpot 代码中 C++ 使用的现有限制和最佳实践建议基于 C++98/03 语言标准,并在HotSpot 样式指南中进行了描述。
我们将在该文档中添加针对最新语言标准功能的类似限制和指南。它们将通过允许的功能表和另一个排除的功能表来描述。使用允许的功能可能是无条件的,也可能有一些限制或附加指导。禁止在 HotSpot 代码中使用排除的功能。
还有第三类,即未定的功能,HotSpot 开发人员尚未就其达成共识,或者可能根本没有讨论过。也禁止使用这些功能。
但请注意,某些语言功能的使用可能不会立即显而易见,并且可能会意外地使用,因为编译器会接受它们。与往常一样,代码审查过程是应对这种情况的主要防御措施。
对功能分类的拟议更改由HotSpot 组成员粗略共识批准,并由组负责人确定。此类更改必须记录在样式指南的更新中。
C++11 和 C++14 的新功能列表及其描述链接可以在某些编译器和库的在线文档中找到:
根据经验,鼓励允许简化代码编写(尤其是阅读代码)的功能。
HotSpot 很大程度上避免使用 C++ 标准库。其中一些原因可能已经过时(特别是早期版本中遇到的错误),而其他原因可能仍然适用(最小化依赖性)。标准库的分类应该经历与语言特性相同的过程。
HotSpot 的一组初始功能分类如下。