C++17 編譯器支援
出自 cppreference.com
* - 將游標懸停在標有星號 * 的儲存格上可查看額外的彈出說明。
DRnn - "DR" 後的數字 nn 表示該缺陷報告適用的 C++ 修訂版本,例如 DR20 → C++20。
[編輯] C++17 核心語言特性
| C++17 特性 |
提案論文 (Papers) |
GCC |
Clang |
MSVC |
Apple Clang |
EDG eccp |
Intel C++ |
Nvidia HPC C++ (原 PGI)* |
Nvidia nvcc |
Cray |
Embarcadero C++ Builder |
IBM Open XL C++ for AIX |
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| DR11: auto 於直接列表初始化之新規則 | N3922 | 5 | 3.8 | 19.0 (2015)* | 是 | 4.10.1 | 17.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| 模板模板參數中的 typename | N4051 | 5 | 3.5 | 19.0 (2015)* | 是 | 4.10.1 | 17.0 | 17.7 | 是* | 11.0 | 10.3 | 17.1.0 | |
| 移除三字元組 | N4086 | 5 | 3.5 | 16.0* | 是 | 5.0 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | ||
| 巢狀命名空間定義 | N4230 | 6 | 3.6 | 19.0 (更新 3)* | 是 | 4.12 | 17.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| static_assert 不帶訊息 (特性測試巨集)* | N3928 | 6 | 2.5 | 19.10* | 是 | 4.12 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| 屬性用於命名空間與列舉器 (特性測試巨集)* (特性測試巨集)* | N4266 | 4.9 (部分支援)* 6 |
3.6 | 19.0 (2015)* | 是 | 4.11 | 17.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
u8 字元字面值
|
N4267 | 6 | 3.6 | 19.0 (2015)* | 是 | 4.11 | 17.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| 允許所有非型別模板參數的常數求值 (特性測試巨集)* | N4268 | 6 | 3.6 | 19.12* | 是 | 5.0 | 19.0.1 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| 一元折疊表達式與空參數包 | P0036R0 | 6 | 3.9 | 19.12* | 是 | 4.14 | 19.0 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| 移除已棄用的 register 關鍵字使用 | P0001R1 | 7 | 3.8 | 19.11* | 是 | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| 移除已棄用的 operator++(bool) | P0002R1 | 7 | 3.8 | 19.11* | 是 | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| 使例外規範成為型別系統的一部分 (特性測試巨集)* | P0012R1 | 7 | 4 | 19.12* | 是 | 4.14 | 19.0 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| __has_include 於前置處理器條件式中 | P0061R1 | 5 | 是 | 19.11* | 是 | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| DR11: 繼承建構子的新規範 (DR1941 等) (特性測試巨集)* | P0136R1 | 7 | 3.9 | 19.14** | 是 | 6.1 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | ||
| 帶有基底類別的聚合類別 (特性測試巨集)* | P0017R1 | 7 | 3.9 | 19.14* | 是 | 5.0 | 19.0.1 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| 折疊表達式 (特性測試巨集)* | N4295 | 6 | 3.6 | 19.12* | 是 | 4.14 | 19.0 | 18.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Lambda 捕捉 *this (特性測試巨集)* | P0018R3 | 7 | 3.9 | 19.11* | 是 | 4.14 | 19.0 | 18.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| 列舉的直接列表初始化 | P0138R2 | 7 | 3.9 | 19.11* | 是 | 4.14 | 18.0 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
constexpr lambda 表達式 (特性測試巨集)* |
P0170R1 | 7 | 5 | 19.11* | 是 | 4.14 | 19.0 | 18.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| 基於範圍的 for 迴圈中不同的 begin 和 end 型別 (特性測試巨集)* | P0184R0 | 6 | 3.9 | 19.10* | 是 | 4.12 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
[[fallthrough]] 屬性 |
P0188R1 | 7 | 3.9 | 19.10* | 是 | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
[[nodiscard]] 屬性 |
P0189R1 | 7 | 3.9 | 19.11* | 是 | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
[[maybe_unused]] 屬性 |
P0212R1 | 7 | 3.9 | 19.11* | 是 | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| 十六進位浮點數字面值 (特性測試巨集)* | P0245R1 | 3.0 | 是 | 19.11* | 是 | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| 不重複地使用屬性命名空間 | P0028R4 | 7 | 3.9 | 19.11* | 是 | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| 過度對齊資料的動態記憶體配置 (特性測試巨集)* | P0035R4 | 7 | 4 | 19.12* | 10.0.0* | 4.14 | 19.0 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| 帶有 auto 型別的非型別模板參數 (特性測試巨集)* | P0127R2 | 7 | 4 | 19.14* | 是 | 5.0 | 19.0.1 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| 保證的複製省略 (特性測試巨集)* | P0135R1 | 7 | 4 | 19.13* | 是 | 5.0 | 19.0.1 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| 替換含有參照成員的類別物件 | P0137R1 | 7 | 6 | 19.14* | 是 | 5.0 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | ||
| 更嚴格的表達式求值順序 | P0145R3 | 7 | 4 | 19.14* | 是 | 5.0 | 19.0.1 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| 結構化綁定 (特性測試巨集)* | P0217R3 | 7 | 4 | 19.11* | 是 | 4.14 | 19.0 | 18.1 | 11.0* | 11.0 | 10.3 | 17.1.0 | |
| 忽略未知屬性 | P0283R2 | 是 | 3.9 | 19.0 (2015)* | 是 | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| constexpr if 陳述式 (特性測試巨集)* | P0292R2 | 7 | 3.9 | 19.11* | 是 | 4.14 | 19.0 | 18.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| if 和 switch 的初始化陳述式 | P0305R1 | 7 | 3.9 | 19.11* | 是 | 4.14 | 18.0 | 18.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| inline 變數 (特性測試巨集)* | P0386R2 | 7 | 3.9 | 19.12* | 是 | 4.14 | 19.0 | 18.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| 移除動態例外規範 | P0003R5 | 7 | 4 | 19.12* | 是 | 4.14 | 19.0 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| using 宣告中的包擴展 (特性測試巨集)* | P0195R2 | 7 | 4 | 19.14* | 是 | 5.0 | 19.0 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| DR98: 模板模板引數的匹配排除相容模板 (特性測試巨集)* | P0522R0 | 7 | 4 | 19.12* | 是 | 5.0 | 19.0.1 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| 類別模板引數推導 (特性測試巨集)* | P0091R3 | 7 | 5 | 19.14* | 是 | 5.0 | 19.0.1 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| C++17 特性 |
提案論文 (Papers) |
GCC |
Clang |
MSVC |
Apple Clang |
EDG eccp |
Intel C++ |
Nvidia HPC C++ (原 PGI)* |
Nvidia nvcc |
Cray |
Embarcadero C++ Builder |
IBM Open XL C++ for AIX |
[編輯] C++17 函式庫特性
| C++17 特性 |
提案論文 (Papers) |
GCC libstdc++ |
Clang libc++ |
MSVC STL |
Apple Clang* |
IBM Open XL C/C++ for AIX* |
Intel Parallel STL |
Embarcadero C++ Builder* |
|
|---|---|---|---|---|---|---|---|---|---|
| std::void_t (特性測試巨集)* | N3911 | 6.1 | 3.6 | 19.0 (2015)* | 是 | 17.1.0 | 不適用 (N/A) | 10.3 | |
| std::uncaught_exceptions() (特性測試巨集)* | N4259 | 6.1 | 3.7 | 19.0 (2015)* | 是 | 17.1.0 | 不適用 (N/A) | 10.3 | |
| std::size(), std::empty() 與 std::data() (特性測試巨集)* | N4280 | 6 | 3.6 | 19.0 (2015)* | 是 | 17.1.0 | 不適用 (N/A) | 10.3 | |
| std::allocator_traits::is_always_equal, noexcept 清理 (特性測試巨集)* | N4258 | 6.1 | 3.7 | 19.0 (2015)* | 17.1.0 | 不適用 (N/A) | |||
| std::invoke (特性測試巨集)* | N4169 | 6.1 | 3.7 | 19.0 (2015)* | 是 | 17.1.0 | 不適用 (N/A) | ||
| std::map::try_emplace, std::map::insert_or_assign (特性測試巨集)* | N4279 | 6.1 | 3.7 | 19.0 (2015)* | 是 | 17.1.0 | 不適用 (N/A) | ||
| std::unordered_map::try_emplace, std::unordered_map::insert_or_assign (特性測試巨集)* | N4279 | 6.1 | 3.7 | 19.0 (2015)* | 是 | 17.1.0 | 不適用 (N/A) | ||
| 改進 std::pair 與 std::tuple | N4387 | 6.1 | 4 | 19.0 (更新 2)* | 是 | 17.1.0 | 不適用 (N/A) | 10.3 | |
| std::bool_constant (特性測試巨集)* | N4389 | 6.1 | 3.7 | 19.0 (2015)* | 是 | 17.1.0 | 不適用 (N/A) | 10.3 | |
| std::shared_mutex (無時限) (特性測試巨集)* | N4508 | 6 | 3.7 | 19.0 (更新 2)* | 是 | 17.1.0 | 不適用 (N/A) | 10.3 | |
| 對 std::forward_list, std::list 和 std::vector 的最小化不完整型別支援 (特性測試巨集)* | N4510 | 3.0 | 3.6 | 18.0* | 是 | 17.1.0 | 不適用 (N/A) | ||
| 型別特性變數模板 (特性測試巨集)* | P0006R0 | 7.1 | 3.8 | 19.0 (更新 2)* | 是 | 17.1.0 | 不適用 (N/A) | 10.3 | |
| 邏輯運算子型別特性 (特性測試巨集)* | P0013R1 | 6.1 | 3.8 | 19.0 (更新 2)* | 是 | 17.1.0 | 不適用 (N/A) | 10.3 | |
| std::as_const (特性測試巨集)* | P0007R1 | 7.1 | 3.8 | 19.0 (更新 2)* | 是 | 17.1.0 | 不適用 (N/A) | ||
| std::chrono::duration 和 std::chrono::time_point 的四捨五入函數 (特性測試巨集)* | P0092R1 | 7.1 | 3.8 | 19.0 (更新 2)* | 是 | 17.1.0 | 不適用 (N/A) | ||
| 透明的 std::owner_less (std::owner_less<void>) (特性測試巨集)* | P0074R0 | 7.1 | 3.8 | 19.0 (更新 2)* | 是 | 17.1.0 | 不適用 (N/A) | ||
| std::not_fn (特性測試巨集)* | P0005R4 P0358R1 |
7.1 | 3.9 | 19.12* | 是 | 17.1.0 | 不適用 (N/A) | 10.3 | |
| 平行演算法與執行策略 (特性測試巨集)* (特性測試巨集)* | P0024R2 | 9* | 17 (部分支援)* |
19.14* | 18.0* | ||||
| std::clamp() (特性測試巨集)* | P0025R1 | 7 | 3.9 | 19.0 (更新 3)* | 10.0.0* | 17.1.0 | 不適用 (N/A) | 10.3 | |
| (不拋例外)可交換性特性 (特性測試巨集)* | P0185R1 | 7.1* | 3.9 | 19.0 (更新 3)* | 10.0.0* | 17.1.0 | 不適用 (N/A) | 10.3 | |
| 多型記憶體資源 (特性測試巨集)* | P0220R1 | 9.1 | 16 | 19.13* | 15.0.0* | 17.1.1 | 不適用 (N/A) | 10.3 | |
| std::apply (特性測試巨集)* | P0220R1 | 7.1 | 16 | 19.13* | 是 | 17.1.0 | 不適用 (N/A) | ||
| 搜尋器 (特性測試巨集)* | P0220R1 | 7.1 | 16 | 19.13* | 是 | 17.1.0 | 不適用 (N/A) | ||
| std::sample (特性測試巨集)* | P0220R1 | 7.1 | 16 | 19.13* | 是 | 17.1.0 | 不適用 (N/A) | ||
| 數學特殊函數 (特性測試巨集)* | P0226R1 | 7 | 19.14* | 17.1.1 | 不適用 (N/A) | 10.3 | |||
| constexpr std::addressof (特性測試巨集)* | LWG2296 | 7.1 | 是 | 19.0 (更新 3)* | 17.1.0 | 不適用 (N/A) | |||
| 對 std::reverse_iterator, std::move_iterator, std::array 和 範圍存取的 constexpr (特性測試巨集)* | P0031R0 | 7.1 | 4 | 19.11* | 是 | 17.1.0 | 不適用 (N/A) | ||
| constexpr std::atomic<T>::is_always_lock_free (特性測試巨集)* | P0152R1 | 7.1 | 3.9 | 19.11* | 是 | 17.1.0 | 不適用 (N/A) | ||
| std::enable_shared_from_this::weak_from_this (特性測試巨集)* | P0033R1 | 7.1 | 3.9 | 19.12* | 是 | 17.1.0 | 不適用 (N/A) | ||
| std::hypot 的三引數多載 (特性測試巨集)* | P0030R1 | 7.1 | 3.9 | 19.14* | 是 | 17.1.0 | 不適用 (N/A) | ||
| std::byte (特性測試巨集)* | P0298R3 | 7 | 5 | 19.11* | 是 | 17.1.1 | 不適用 (N/A) | 10.3 | |
| std::string_view (特性測試巨集)* | N3921 P0220R1 P0254R2 P0403R1 |
7.1 | 4 | 19.10* (partial)* 19.11** |
10.0.0* | 17.1.0 | 不適用 (N/A) | 10.3 | |
| std::any (特性測試巨集)* | P0220R1 P0032R3 |
7.1 | 4 | 19.10* | 10.0.0* | 17.1.0 | 不適用 (N/A) | 10.3 | |
| std::optional (特性測試巨集)* | P0220R1 | 7.1 | 4 | 19.10* | 10.0.0* | 17.1.0 | 不適用 (N/A) | 10.3 | |
| C11 標準函式庫的主要部分 | P0063R3 | 9.1 | 7 | 19.0 (2015)* (部分支援)* |
10.0.0* | 17.1.1 | 不適用 (N/A) | ||
| 拼接 Maps 與 Sets (特性測試巨集)* | P0083R3 | 7 | 8 | 19.12* | 10.0.0* | 17.1.1 | 不適用 (N/A) | ||
| 某些容器的 emplace* 函數回傳型別從 void 變為參照 | P0084R2 | 7.1 | 4.0 | 19.11* | 是 | 17.1.0 | 不適用 (N/A) | ||
| std::variant (特性測試巨集)* | P0088R3 | 7.1 | 4 | 19.10* | 10.0.0* | 17.1.0 | 不適用 (N/A) | 10.3 | |
| std::make_from_tuple() (特性測試巨集)* | P0209R2 | 7.1 | 3.9 | 19.10* | 是 | 17.1.0 | 不適用 (N/A) | 10.3 | |
| std::has_unique_object_representations (特性測試巨集)* | P0258R2 | 7.1 | 6 | 19.11* | 是 | 17.1.1 | 不適用 (N/A) | 10.3 | |
| std::gcd() 與 std::lcm() (特性測試巨集)* | P0295R0 | 7 | 4 | 19.11* | 是 | 17.1.0 | 不適用 (N/A) | 10.3 | |
| CWG issue 1776: 替換含有參照成員的類別物件 (std::launder) (特性測試巨集)* | P0137R1 | 7.1 | 6 | 19.14* | 是 | 17.1.0 | 不適用 (N/A) | ||
| 擴展記憶體管理工具 (特性測試巨集)* | P0040R3 | 7.1 | 4 | 19.11* | 17.1.0 | 不適用 (N/A) | |||
| shared_ptr::weak_type (特性測試巨集)* | P0163R0 | 7.1 | 3.9 | 19.10* | 是 | 17.1.0 | 不適用 (N/A) | ||
| 基本字串轉換: std::to_chars / std::from_chars (特性測試巨集)* | P0067R5 | 8* 11 |
7* 14* 20* |
19.14** 19.24* |
10.0.0** | 17.1.1* | 不適用 (N/A) | 10.3* | |
| 支援陣列的 std::shared_ptr 與 std::weak_ptr | P0414R2 | 7 | 11 | 19.12* | 12.0.0* | 17.1.1 | 不適用 (N/A) | 10.3 | |
| std::chrono::duration 和 std::chrono::time_point 所有成員函數的 Constexpr (特性測試巨集)* | P0505R0 | 7.1 | 4 | 19.11* | 是 | 17.1.1 | 不適用 (N/A) | ||
| std::shared_ptr<T[]> (特性測試巨集)* | P0497R0 | 7.1 | 11 | 19.12* | 17.1.1 | 不適用 (N/A) | |||
| constexpr std::char_traits (特性測試巨集)* | P0426R1 | 8.1 | 4 | 19.14* | 是 | 17.1.1 | 不適用 (N/A) | ||
| 檔案系統函式庫 (std::filesystem) (特性測試巨集)* | P0218R1 P0219R1 |
8 | 7 | 19.14* | 11.0.0* | 17.1.1 | 不適用 (N/A) | 10.3 | |
| 硬體干涉大小 (特性測試巨集)* | P0154R1 | 12.1 | 15 (部分)* 19 |
19.11* | 不適用 (N/A) | 10.3 | |||
| std::scoped_lock (特性測試巨集)* | P0156R2 | 7 | 5 | 19.11* | 是 | 17.1.1 | 不適用 (N/A) | 10.3 | |
| std::is_aggregate (特性測試巨集)* | LWG2911 | 7 | 5 | 19.15* | 是 | 17.1.1 | 不適用 (N/A) | 10.3 | |
| std::is_invocable, std::invoke_result (特性測試巨集)* | P0604R0 | 7.1 | 是 | 19.11* | 是 | 17.1.1 | 不適用 (N/A) | ||
| DR17: std::hash<std::filesystem::path> | LWG3657 | 11.4 | 17 | 19.32* | 不適用 (N/A) | ||||
| C++17 特性 |
提案論文 (Papers) |
GCC libstdc++ |
Clang libc++ |
MSVC STL |
Apple Clang* |
IBM Open XL C/C++ for AIX* |
Intel Parallel STL |
Embarcadero C++ Builder* |
[編輯] 備註
- 截至 2020-11-20,Oracle Developer Studio 的最新版本為 12.6。其文件並未提及 C++17。
- Cray 編譯器可能在 11.0 版之前就支援某些特性。該版本是它成為 Clang 衍生版本的時候,並獲得了基礎編譯器所有相關的語言特性支援。請參閱 Cray/HPE 文件 S-2179。