C++ Standards Support in GCC - GCC 对 C++ 标准的支持
C++ Standards Support in GCC - 2019-2-20
GCC supports different dialects of C++, corresponding to the multiple published ISO standards. Which standard it implements can be selected using the -std= command-line option.
For information about the status of the library implementation, please see this page.
C++2a Support in GCC
GCC has experimental support for the next revision of the C++ standard, which is expected to be published in 2020.
C++2a features are available as part of "mainline" GCC in the trunk of GCC's repository and will be available in GCC 8 and later. To enable C++2a support, add the command-line parameter -std=c++2a to your g++ command line. Or, to enable GNU extensions in addition to C++2a features, add -std=gnu++2a.
Important: Because the ISO C++2a standard is still evolving, GCC's support is experimental. No attempt will be made to maintain backward compatibility with implementations of C++2a features that do not reflect the final standard.
C++2a Language Features
The following table lists new language features that have been accepted into the C++2a working draft. The "Proposal" column provides a link to the ISO C++ committee proposal that describes the feature, while the "Available in GCC?" column indicates the first version of GCC that contains an implementation of this feature (if it has been implemented).
| Language Feature | Proposal | Available in GCC? | SD-6 Feature Test |
|---|---|---|---|
| Default member initializers for bit-fields | P0683R1 | 8 | |
| Fixing const-qualified pointers to members | P0704R1 | 8 | |
Allow lambda capture [=, this] |
P0409R2 | 8 | |
__VA_OPT__ for preprocessor comma elision |
P0306R4 P1042R1 |
8 (partial, no #__VA_OPT__ support) |
|
| Designated initializers | P0329R4 | 8 | |
| Familiar template syntax for generic lambdas | P0428R2 | 8 | |
| List deduction of vector | P0702R1 | 8 | |
| Concepts | P0734R0 P0857R0 P1084R2 P1141R2 |
TS with -fconcepts | |
| Range-based for statements with initializer | P0614R1 | 9 | |
| Simplifying implicit lambda capture | P0588R1 | 8 | |
| ADL and function templates that are not visible | P0846R0 | 9 | |
const mismatch with defaulted copy constructor |
P0641R2 | 9 | |
Less eager instantiation of constexpr functions |
P0859R0 | 5.2 (mostly) 9 (P0859R0) |
|
Consistent comparison (operator<=>) |
P0515R3 P0905R1 P1120R0 |
No | __cpp_impl_three_way_comparison >= 201711 |
| Access checking on specializations | P0692R1 | Yes | |
| Default constructible and assignable stateless lambdas | P0624R2 | 9 | |
| Lambdas in unevaluated contexts | P0315R4 | 9 | |
| Language support for empty objects | P0840R2 | 9 | |
| Relaxing the range-for loop customization point finding rules | P0962R1 | 8 | |
| Allow structured bindings to accessible members | P0969R0 | 8 | |
| Relaxing the structured bindings customization point finding rules | P0961R1 | 8 | |
| Down with typename! | P0634R3 | 9 | |
| Allow pack expansion in lambda init-capture | P0780R2 | 9 | |
| Proposed wording for likely and unlikely attributes | P0479R5 | 9 | |
| Deprecate implicit capture of this via [=] | P0806R2 | 9 | |
| Class Types in Non-Type Template Parameters | P0732R2 | 9 | __cpp_nontype_template_parameter_class >= 201806 |
| Atomic Compare-and-Exchange with Padding Bits | P0528R3 | No (PR 88101) | |
| Efficient sized delete for variable sized classes | P0722R3 | 9 | __cpp_impl_destroying_delete >= 201806 |
| Allowing Virtual Function Calls in Constant Expressions | P1064R0 | 9 | |
| Prohibit aggregates with user-declared constructors | P1008R1 | 9 | |
| Support for contract based programming in C++ | P0542R5 P1289R1 |
No (PR 88102) | |
| explicit(bool) | P0892R2 | 9 | __cpp_conditional_explicit >= 201806 |
| Signed integers are two's complement | P1236R1 | 9 | |
| char8_t | P0482R6 | 9 | __cpp_char8_t >= 201811 |
| Immediate functions (consteval) | P1073R3 | No | |
| std::is_constant_evaluated | P0595R2 | 9 | |
| Nested inline namespaces | P1094R2 | 9 | |
| Relaxations of constexpr restrictions | P1002R1 P1327R1 P1330R0 |
No | |
| Feature test macros | P0941R2 | 4.9 (__cpp_ macros) 5 ( __has_cpp_attribute) |
C++17 Support in GCC
GCC has experimental support for the latest revision of the C++ standard, which was published in 2017.
C++17 features are available as part of "mainline" GCC in the trunk of GCC's repository and in GCC 5 and later. To enable C++17 support, add the command-line parameter -std=c++17 to your g++ command line. Or, to enable GNU extensions in addition to C++17 features, add -std=gnu++17.
Important: Because the final ISO C++17 standard is still new, GCC's support is experimental. No attempt will be made to maintain backward compatibility with implementations of C++17 features that do not reflect the final standard.
C++17 Language Features
The following table lists new language features that have been accepted into the C++17 working draft. The "Proposal" column provides a link to the ISO C++ committee proposal that describes the feature, while the "Available in GCC?" column indicates the first version of GCC that contains an implementation of this feature (if it has been implemented).
| Language Feature | Proposal | Available in GCC? | SD-6 Feature Test |
|---|---|---|---|
| Removing trigraphs | N4086 | 5 | |
u8 character literals |
N4267 | 6 | __cpp_unicode_characters >= 201411 |
| Folding expressions | N4295 | 6 | __cpp_fold_expressions >= 201411 |
| Attributes for namespaces and enumerators | N4266 | 4.9 (namespaces) 6 (enumerators) |
__cpp_namespace_attributes >= 201411 __cpp_enumerator_attributes >= 201411 |
| Nested namespace definitions | N4230 | 6 | __cpp_nested_namespace_definitions >= 201411 |
| Allow constant evaluation for all non-type template arguments | N4268 | 6 | __cpp_nontype_template_args >= 201411 |
Extending static_assert |
N3928 | 6 | __cpp_static_assert >= 201411 |
| New Rules for auto deduction from braced-init-list | N3922 | 5 | |
| Allow typename in a template template parameter | N4051 | 5 | |
[[fallthrough]] attribute |
P0188R1 | 7 | __has_cpp_attribute(fallthrough) |
[[nodiscard]] attribute |
P0189R1 | 4.8 ([[gnu::warn_unused_result]])7 (P0189R1) |
__has_cpp_attribute(nodiscard) |
[[maybe_unused]] attribute |
P0212R1 | 4.8 ([[gnu::unused]])7 (P0212R1) |
__has_cpp_attribute(maybe_unused) |
| Extension to aggregate initialization | P0017R1 | 7 | __cpp_aggregate_bases >= 201603 |
Wording for constexpr lambda |
P0170R1 | 7 | __cpp_constexpr >= 201603 |
| Unary Folds and Empty Parameter Packs | P0036R0 | 6 | __cpp_fold_expressions >= 201603 |
| Generalizing the Range-Based For Loop | P0184R0 | 6 | __cpp_range_based_for >= 201603 |
Lambda capture of *this by Value |
P0018R3 | 7 | __cpp_capture_star_this >= 201603 |
Construction Rules for enum class variables |
P0138R2 | 7 | |
| Hexadecimal floating literals for C++ | P0245R1 | 3.0 | __cpp_hex_float >= 201603 |
| Dynamic memory allocation for over-aligned data | P0035R4 | 7 | __cpp_aligned_new >= 201606 |
| Guaranteed copy elision | P0135R1 | 7 | __cpp_guaranteed_copy_elision >= 201606 |
| Refining Expression Evaluation Order for Idiomatic C++ | P0145R3 | 7 | |
constexpr if |
P0292R2 | 7 | __cpp_if_constexpr >= 201606 |
| Selection statements with initializer | P0305R1 | 7 | |
| Template argument deduction for class templates | P0091R3 P0512R0 |
7 8 |
__cpp_deduction_guides >= 201606 __cpp_deduction_guides >= 201611 |
| Declaring non-type template parameters with auto | P0127R2 | 7 | __cpp_template_auto >= 201606 __cpp_nontype_template_parameter_auto >= 201606 |
| Using attribute namespaces without repetition | P0028R4 | 7 | |
| Ignoring unsupported non-standard attributes | P0283R2 | Yes | |
| Structured bindings | P0217R3 | 7 | __cpp_structured_bindings >= 201606 |
Remove Deprecated Use of the register Keyword |
P0001R1 | 7 | |
Remove Deprecated operator++(bool) |
P0002R1 | 7 | |
| Make exception specifications be part of the type system | P0012R1 | 7 | __cpp_noexcept_function_type >= 201510 |
__has_include for C++17 |
P0061R1 | 5 | |
| Rewording inheriting constructors (core issue 1941 et al) | P0136R1 | 7 | __cpp_inheriting_constructors >= 201511 |
| Inline variables | P0386R2 | 7 | __cpp_inline_variables >= 201606 |
| DR 150, Matching of template template arguments | P0522R0 | 7 | __cpp_template_template_args >= 201611 |
| Removing dynamic exception specifications | P0003R5 | 7 | |
| Pack expansions in using-declarations | P0195R2 | 7 | __cpp_variadic_using >= 201611 |
A byte type definition |
P0298R0 | 7 |
Technical Specifications
GCC also implements experimental support for some language Technical Specifications published by the C++ committee.
Important: Because these Technical Specifications are still evolving toward future inclusion in a C++ standard, GCC's support is experimental. No attempt will be made to maintain backward compatibility with implementations of features that do not reflect the final standard.
| Technical Specification | Document | Available in GCC? | Compiler Option | SD-6 Feature Test |
|---|---|---|---|---|
| Concepts | N4377 | 6 | -fconcepts | __cpp_concepts >= 201507 |
| Transactional Memory | N4514 | 6 (no atomic_cancel) | -fgnu-tm | __cpp_transactional_memory >= 201505 |
| Coroutines | N4649 | No | ||
| Modules | N4720 | In progress |
C++14 Support in GCC
GCC has full support for the previous revision of the C++ standard, which was published in 2014.
This mode is the default in GCC 6.1 and above; it can be explicitly selected with the -std=c++14 command-line flag, or -std=gnu++14 to enable GNU extensions as well.
C++14 Language Features
The following table lists new language features that are part of the C++14 standard. The "Proposal" column provides a link to the ISO C++ committee proposal that describes the feature, while the "Available in GCC?" column indicates the first version of GCC that contains an implementation of this feature.
| Language Feature | Proposal | Available in GCC? | SD-6 Feature Test |
|---|---|---|---|
| Tweak to certain C++ contextual conversions | N3323 | 4.9 | |
| Binary literals | N3472 | 4.3 (GNU) 4.9 (N3472) |
__cpp_binary_literals >= 201304 |
| Return type deduction for normal functions | N3638 | 4.8 (N3386) 4.9 (N3638) |
__cpp_decltype_auto >= 201304 |
| Generalized lambda capture (init-capture) | N3648 | 4.5 (partial) 4.9 (N3648) |
__cpp_init_captures >= 201304 |
| Generic (polymorphic) lambda expressions | N3649 | 4.9 | __cpp_generic_lambdas >= 201304 |
| Variable templates | N3651 | 5 | __cpp_variable_templates >= 201304 |
| Relaxing requirements on constexpr functions | N3652 | 5 | __cpp_constexpr >= 201304 |
| Member initializers and aggregates | N3653 | 5 | __cpp_aggregate_nsdmi >= 201304 |
| Clarifying memory allocation | N3664 | N/A | |
| Sized deallocation | N3778 | 5 | __cpp_sized_deallocation >= 201309 |
| [[deprecated]] attribute | N3760 | 4.9 (N3797) | __has_cpp_attribute(deprecated) >= 201309 |
| Single-quotation-mark as a digit separator | N3781 | 4.9 (N3797) | __cpp_digit_separator >= 201309 |
This feature was briefly part of the C++14 working paper, but was not part of the published standard; as a result, it has been removed from the compiler.
| Language Feature | Proposal | Available in GCC? | SD-6 Feature Test |
|---|---|---|---|
| Runtime-sized arrays with automatic storage duration (Removed from the standard) |
N3639 | ?.? (GNU VLAs) 4.9 (N3639) 5 (GNU VLAs) |
__cpp_runtime_arrays >= 198712 |
C++11 Support in GCC
GCC 4.8.1 was the first feature-complete implementation of the 2011 C++ standard, previously known as C++0x.
This mode can be selected with the -std=c++11 command-line flag, or -std=gnu++11 to enable GNU extensions as well.
For information about C++11 support in a specific version of GCC, please see:
- GCC 4.3 C++0x Status
- GCC 4.4 C++0x Status
- GCC 4.5 C++0x Status
- GCC 4.6 C++0x Status
- GCC 4.7 C++11 Status
- GCC 4.8 C++11 Status
| Language Feature | Proposal | Available in GCC? | SD-6 Feature Test |
|---|---|---|---|
| Rvalue references | N2118 | GCC 4.3 | __cpp_rvalue_references >= 200610 |
Rvalue references for *this |
N2439 | GCC 4.8.1 | __cpp_ref_qualifiers >= 200710 |
| Initialization of class objects by rvalues | N1610 | Yes | |
| Non-static data member initializers | N2756 | GCC 4.7 | __cpp_nsdmi >= 200809 |
| Variadic templates | N2242 | GCC 4.3 | __cpp_variadic_templates >= 200704 |
| Extending variadic template template parameters | N2555 | GCC 4.4 | |
| Initializer lists | N2672 | GCC 4.4 | __cpp_initializer_lists >= 200806 |
| Static assertions | N1720 | GCC 4.3 | __cpp_static_assert >= 200410 |
auto-typed variables |
N1984 | GCC 4.4 | |
Multi-declarator auto |
N1737 | GCC 4.4 | |
| Removal of auto as a storage-class specifier | N2546 | GCC 4.4 | |
| New function declarator syntax | N2541 | GCC 4.4 | |
| New wording for C++0x lambdas | N2927 | GCC 4.5 | __cpp_lambdas >= 200907 |
| Declared type of an expression | N2343 | GCC 4.3 | __cpp_decltype >= 200707 |
| decltype and call expressions | N3276 | GCC 4.8.1 | |
| Right angle brackets | N1757 | GCC 4.3 | |
| Default template arguments for function templates | DR226 | GCC 4.3 | |
| Solving the SFINAE problem for expressions | DR339 | GCC 4.4 | |
| Template aliases | N2258 | GCC 4.7 | __cpp_alias_templates >= 200704 |
| Extern templates | N1987 | Yes | |
| Null pointer constant | N2431 | GCC 4.6 | |
| Strongly-typed enums | N2347 | GCC 4.4 | |
| Forward declarations for enums | N2764 | GCC 4.6 | |
| Generalized attributes | N2761 | GCC 4.8 | __cpp_attributes >= 200809; __has_cpp_attribute(noreturn) >= 200809; __has_cpp_attribute(carries_dependency) == 0 (not implemented) |
| Generalized constant expressions | N2235 | GCC 4.6 | __cpp_constexpr >= 200704 |
| Alignment support | N2341 | GCC 4.8 | |
| Delegating constructors | N1986 | GCC 4.7 | __cpp_delegating_constructors >= 200604 |
| Inheriting constructors | N2540 | GCC 4.8 | __cpp_inheriting_constructors >= 200802 |
| Explicit conversion operators | N2437 | GCC 4.5 | |
| New character types | N2249 | GCC 4.4 | __cpp_unicode_characters >= 200704 |
| Unicode string literals | N2442 | GCC 4.5 | __cpp_unicode_literals >= 200710 |
| Raw string literals | N2442 | GCC 4.5 | __cpp_raw_strings >= 200710 |
| Universal character name literals | N2170 | GCC 4.5 | |
| User-defined literals | N2765 | GCC 4.7 | __cpp_user_defined_literals >= 200809 |
| Standard Layout Types | N2342 | GCC 4.5 | |
| Defaulted and deleted functions | N2346 | GCC 4.4 | |
| Extended friend declarations | N1791 | GCC 4.7 | |
Extending sizeof |
N2253 | GCC 4.4 | |
| Inline namespaces | N2535 | GCC 4.4 | |
| Unrestricted unions | N2544 | GCC 4.6 | |
| Local and unnamed types as template arguments | N2657 | GCC 4.5 | |
| Range-based for | N2930 | GCC 4.6 | __cpp_range_based_for >= 200907 |
| Explicit virtual overrides | N2928 N3206 N3272 |
GCC 4.7 | |
| Minimal support for garbage collection and reachability-based leak detection | N2670 | No | |
| Allowing move constructors to throw [noexcept] | N3050 | GCC 4.6 | |
| Defining move special member functions | N3053 | GCC 4.6 | |
| Concurrency | |||
| Sequence points | N2239 | Yes | |
| Atomic operations | N2427 | GCC 4.4 | |
| Strong Compare and Exchange | N2748 | GCC 4.5 | |
| Bidirectional Fences | N2752 | GCC 4.8 | |
| Memory model | N2429 | GCC 4.8 | |
| Data-dependency ordering: atomics and memory model | N2664 | GCC 4.4 (memory_order_consume) |
|
| Propagating exceptions | N2179 | GCC 4.4 | |
| Abandoning a process and at_quick_exit | N2440 | GCC 4.8 | |
| Allow atomics use in signal handlers | N2547 | Yes | |
| Thread-local storage | N2659 | GCC 4.8 | |
| Dynamic initialization and destruction with concurrency | N2660 | GCC 4.3 | __cpp_threadsafe_static_init >= 200806 |
| C99 Features in C++11 | |||
__func__ predefined identifier |
N2340 | GCC 4.3 | |
| C99 preprocessor | N1653 | GCC 4.3 | |
long long |
N1811 | GCC 4.3 | |
| Extended integral types | N1988 | Yes | |
C++98 Support in GCC
GCC has full support for the 1998 C++ standard as modified by the 2003 technical corrigendum and some later defect reports, excluding the export feature which was later removed from the language.
This mode is the default in GCC versions prior to 6.1; it can be explicitly selected with the -std=c++98 command-line flag, or -std=gnu++98 to enable GNU extensions as well.
Copyright (C) Free Software Foundation, Inc. Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.
These pages are maintained by the GCC team. Last modified 2019-02-07.
C++ Standards Support in GCC - GCC 对 C++ 标准的支持的更多相关文章
- Atomic Builtins - Using the GNU Compiler Collection (GCC) GCC 提供的原子操作
http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Atomic-Builtins.html gcc从4.1.2提供了__sync_*系列的built-in函数,用 ...
- GCC/gcc/g++/CC/cc区别
平常在Linux上经常会用到gcc或者g++来编译程序,但对这两者的理解也就停留在一个是用来编译C程序,另一个是用来编译C++程序的(请注意:这种说法是有问题的,待会改进). 1. GCC GCC,是 ...
- gcc对c++标准的支持
GCC 4.8.1完全支持c++11核心部分,对应的glibc为2.17 gcc 4.9支持c++11正则表达式,卧槽...4.8.5会报terminate called after throwing ...
- arm 开发板更新 gcc/gcc++ | Debain 更新 gcc,无需编译直接更新 gcc
4我的板子是 Orange pi 3,只能以 卧槽来形容... 我是搞.net core的,这板子死活搞不了. 刷的是Debain系统. 说实话,这个板子不错,可就是官方的系统实在不敢恭维,内核旧,软 ...
- Gcc ------ gcc的使用简介与命令行参数说明
gcc的使用简介与命令行参数说明 2011年06月19日 20:29:00 阅读数:10221 2011-06-19 wcdj 参考:<GNU gcc嵌入式系统开发 作者:董文军> (一) ...
- GCC 版本与C11标准
1. GCC版本是否支持C11 C89=C90:gcc选项是:-ansi, -std=c90 or -std=iso9899:; 带了GNU扩展的:-std=gnu90 C94=C95:gcc选项:- ...
- Mysql 连接提示 Client does not support authentication protocol requested by server 客户端不支持服务器请求的身份验证协议;考虑升级MySQL客户端
由于查阅了很多百度文档发现很多方法比较复杂,所以写个备忘: 首先,进入MySQL 8.0Command Line Client -Unicode,输入密码,登录进去. 然后,在命令行输入:ALTER ...
- 专家解读Linux操作系统内核中的GCC特性
专家解读Linux操作系统内核中的GCC特性 Linux内核使用GNU Compiler Collection (GCC)套件的几个特殊功能.这些功能包括提供快捷方式和简化以及向编译器提供优化提示 ...
- Linux 内核中的 GCC 特性
https://www.ibm.com/developerworks/cn/linux/l-gcc-hacks/ GCC 和 Linux 是出色的组合.尽管它们是独立的软件,但是 Linux 完全依靠 ...
随机推荐
- 基于Docker+Prometheus+Grafana监控SpringBoot健康信息
在微服务体系当中,监控是必不可少的.当系统环境超过指定的阀值以后,需要提醒指定的运维人员或开发人员进行有效的防范,从而降低系统宕机的风险.在CNCF云计算平台中,Prometheus+Grafana是 ...
- Android生成自定义二维码
前面说过两种二维码扫描方式,现在说如何生成自定义酷炫二维码.二维码生成需要使用Google开源库Zxing,Zxing的项目地址:https://github.com/ZBar/ZBar,我们只需要里 ...
- PostgreSQL 使用小点
1.timestamp 有分时区和无时区(减少使用),8个字节,包含日期和时间,范围是:公元前4713 - 公元294276.底层存储的是时间戳,这对任何地区的都一样,而具体时间显示则可从数据库层面设 ...
- php,vue,vue-ssr 做出来的页面有什么区别?
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由shirishiyue发表于云+社区专栏 目前我这边的web页面,都是采用php+smarty模板生成的,是一种比较早期的开发模式.好 ...
- JavaWeb学习(三十)———— 数据库连接池
一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...
- [转]完整记录在 windows7 下使用 docker 的过程
本文转自:https://www.jianshu.com/p/d809971b1fc1 借助 docker 可以不在开发电脑中安装环境,比如 nodejs,记录下如何实现. 下载安装 根据自己的电脑系 ...
- c#中打开Excel文档
方法一:(调用Excel的COM组件) 在项目中打开Add Reference对话框,选择COM栏,之后在COM列表中找到"Microsoft Excel 11.0 Object ...
- 部署DTCMS到Jexus遇到的问题及解决思路---Linux环境搭建
最近朋友托我帮忙研究如何把一个DTCMS部署到Linux下,经过1天的研究,部署基本成功,可能有些细节还未注意到,现在把心得分享一下.过程比预期的要简单 身为.Net程序员,这个问题的第一步可能就是如 ...
- 如何使tinymce编辑器的高度随内容自变化(转载)
如何使tinymce编辑器的高度随内容自变化 最简单的方法就是在配置时添加Autoresize插件: tinymce.init({ selector: "textarea", // ...
- 【IDEA&&Eclipse】2、从Eclipse转移到IntelliJ IDEA一点心得
本人使用IntelliJ IDEA其实并不太久,用了这段时间以后,觉得的确很是好用.刚刚从Eclipse转过来的很多人开始可能不适应,我就把使用过程中的一些经验和常用功能分享下,当然在看这篇之前推荐你 ...