GCC 对 C++17 的支持情况如何?

37

Clang有一个好看的页面描述了该项目对于C++1z/C++17特性支持的状态(以及C++11和C++14,它是同一页)

g++有一个关于C++14特性的页面,但我找不到关于C++17/C++1z的任何内容。这是否正在进行但只是不在网上呈现?针对5.0版本?


1
C++17目前处于早期开发阶段,据我所知,GCC还没有支持它的特性。即使是clang也只有有限的实验性支持(http://clang.llvm.org/cxx_status.html#cxx17)。另一方面,GCC也在取得一些进展,请参见:https://patchwork.ozlabs.org/patch/370773/或https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html。 - Goofy
3
libstdc++ 201z 是一个实现 C++ 标准库的项目,它包含在 GNU Compiler Collection (GCC) 中。该项目旨在支持最新的 C++ 标准(C++20)并提供一些扩展功能。libstdc++ 201z 还在积极开发中,以支持未来的 C++ 标准。 - Stephan Dollberg
4个回答

32

12

最终简明回答已更新:

  • GCC 8.x(及以上版本)完全支持所有 C++17 功能。
  • GCC 7.x 支持除类模板参数推导外的所有 C++17 功能。
  • GCC 6.x(及更早版本)对 C++17 功能支持很少或没有。

感谢 @JanVanDijk 提供完整功能表格链接


gcc 中的支持仍被列为“实验性的”。这也可以从手册中推断出。gcc 9 包括对 c++17 的 改进实验性支持 - wreckgar23
你链接的手册中写道:“GCC支持新规范中的所有更改。”该页面上没有找到“实验性”一词。 - einpoklum
这是事实,但是进一步了解的链接显示支持是“实验性的”。此外,手册的第一行只说“GCC支持1998年发布的原始ISO C++标准以及2011年和2014年的修订版”。 - wreckgar23

7
已有一些支持;以下两个总结是基于Clang的列表的:
已支持(截至2015年7月5日):
- 自动推导函数参数在4.9版本以上得到支持。这个特性目前被认为是一种扩展,但已包含在概念提案中,并称为“通用函数”。 - 从5.1.0版本开始,默认忽略三字符组合(trigraphs)。 - 从5.1.0版本开始,模板模板参数支持typename。 - 从5.1.0版本开始,直接列表初始化的新推断规则。 - HEAD版本支持没有消息的静态断言 - HEAD版本支持u8字符字面量 - HEAD版本支持命名空间或枚举器的属性 未支持(截至2015年7月5日;附有有效示例使用链接):
- 折叠表达式 - 嵌套命名空间定义 - 对所有非类型模板参数进行常量求值的功能。
关于在libstdc++中实现库提案的状态,相应手册中有一个列表。

"函数参数的auto"是什么?我在C++17列表中找不到它。 - Suma
三字符并不是一个问题。如果你想要它们,你可以将它们定义为系统源编码的一部分。 - Kerrek SB
1
@Suma:“函数参数的auto”是C++14的新特性:https://dev59.com/lWQm5IYBdhLWcg3w6ShR(虽然所示示例可能是gcc扩展)。 - Thomas
@Thomas 不对。这是C++17计划功能的一部分,“通用函数”,属于概念论文的一部分。通用lambda确实是C++14的一部分。 - Columbo
2
@Columbo:从4.9版本开始,这必须是一个扩展。请参见https://dev59.com/rV8e5IYBdhLWcg3wTI-L#25879737。 您正在以C++14模式编译,GCC 4.9甚至不认识“-std=c++1z”。 - Thomas

4

这实际上似乎比实际编译器供应商维护的功能页面更为最新和全面(!!!)。 - Kyle Strand
实际上,MSVC页面非常好,只是很难找到:https://learn.microsoft.com/en-us/cpp/visual-cpp-language-conformance - Kyle Strand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接