Namespaces
Variants

C++17

From cppreference.net

C++17は、マイナーバージョンであるC++14に続くメジャーバージョンであり、新しい言語機能とライブラリ機能を導入しています。この標準は2017年12月に公開されました。

以下の機能がC++17に統合されました:

目次

廃止された機能

削除された機能
非推奨機能

新しい言語機能

新規ヘッダー

(注:指示に従い、HTMLタグ・属性、 /
/タグ内のテキスト、C++固有用語は翻訳せず、元のフォーマットを保持しています。翻訳対象となるテキストが存在しないため、出力は入力と同一となります)

新規ライブラリ機能

ユーティリティ型

メモリ管理

コンパイル時プログラミング

アルゴリズム

イテレータとコンテナ

数値演算

その他

不具合報告

C++17で修正された欠陥報告書 (290 core, 363 library)

コンパイラサポート

C++17 コア言語機能

翻訳のポイント: - 「Removing dynamic exception specifications」→「動的例外仕様の削除」と訳し、リンクの位置を自然な日本語の語順に調整 - HTMLタグ、属性、
タグ内のテキストは翻訳せず
- C++専門用語「dynamic exception specifications」は「動的例外仕様」と訳出(標準的な技術用語)
- 数値、バージョン番号、コード値はそのまま保持
- 「Yes」→「はい」と訳出
- 書式と構造は完全に保持
C++17 機能

提案文書

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 テンプレートテンプレートパラメータ内のtypename N4051 5 3.5 19.0 (2015)* 対応 4.10.1 17.0 17.7 Yes* 11.0 10.3 17.1.0
トライグラフの削除 trigraphs 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 (Update 3)* 対応 4.12 17.0 17.7 11.0 11.0 10.3 17.1.0
static_assert メッセージなしのstatic_assert  ( FTM ) * N3928 6 2.5 19.10* はい 4.12 18.0 17.7 11.0 11.0 10.3 17.1.0
属性 名前空間と列挙子用  ( FTM ) * ( FTM ) * 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 u8文字リテラル N4267 6 3.6 19.0 (2015)* 対応 4.11 17.0 17.7 11.0 11.0 10.3 17.1.0
すべての定数テンプレート引数に対して定数評価を許可  ( FTM ) * 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
例外仕様を型システムの一部にする  ( FTM ) * 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: 継承コンストラクタの新仕様 inheriting constructors ( DR1941 他)  ( FTM ) * P0136R1 7 3.9 19.14* * はい 6.1 19.1 11.0 11.0 10.3 17.1.0
基底クラスを持つ集成体クラス FTM * P0017R1 7 3.9 19.14* 対応済み 5.0 19.0.1 19.1 11.0 11.0 10.3 17.1.0
畳み込み式 ( FTM ) * N4295 6 3.6 19.12* はい 4.14 19.0 18.1 11.0 11.0 10.3 17.1.0
*thisのラムダキャプチャ ( FTM ) * P0018R3 7 3.9 19.11* Yes 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式 ( FTM ) * P0170R1 7 5 19.11* はい 4.14 19.0 18.1 11.0 11.0 10.3 17.1.0
範囲ベースforにおける異なるbeginとendの型 range-based for ( FTM ) * 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
16進数 浮動小数点リテラル ( FTM ) * 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* Yes 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0
オーバーアライメントされたデータの動的メモリ確保 FTM * P0035R4 7 4 19.12* 10.0.0* 4.14 19.0 19.1 11.0 11.0 10.3 17.1.0
auto 型の非型テンプレートパラメータ  ( FTM ) * P0127R2 7 4 19.14* Yes 5.0 19.0.1 19.1 11.0 11.0 10.3 17.1.0
保証された copy elision ( FTM ) * 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
構造化バインディング ( FTM ) * P0217R3 7 4 19.11* はい 4.14 19.0 18.1 11.0* 11.0 10.3 17.1.0
未知の属性を無視 attributes P0283R2 はい 3.9 19.0 (2015)* はい 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0
constexpr if 文  ( FTM ) * 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
インライン変数 ( FTM ) * 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宣言でのパック展開  ( FTM ) * P0195R2 7 4 19.14* はい 5.0 19.0 19.1 11.0 11.0 10.3 17.1.0
DR98: テンプレートテンプレート引数のマッチングが互換性のあるテンプレートを除外する  ( FTM ) * P0522R0 7 4 19.12* Yes 5.0 19.0.1 19.1 11.0 11.0 10.3 17.1.0
クラステンプレート引数推論 ( FTM ) * P0091R3 7 5 19.14* 対応 5.0 19.0.1 19.1 11.0 11.0 10.3 17.1.0


C++17 機能


論文
GCC
Clang
MSVC
Apple Clang
EDG eccp
Intel C++
Nvidia HPC C++ (ex PGI)*
Nvidia nvcc
Cray
Embarcadero C++ Builder
IBM Open XL C++ for AIX

C++17 ライブラリ機能

翻訳内容: - `Feature-testing macro:` → `機能テストマクロ:` - `Yes` → `対応` - HTMLタグ、属性、C++固有の用語(`std::void_t`、`FTM`、`__cpp_lib_void_t`、`N3911`など)は翻訳せず保持 - 数値、バージョン情報、コード関連のテキストはそのまま保持 変更点: - `Feature-testing macro:` → `機能テストマクロ:` - `Yes` → `対応` - HTMLタグ、属性、コード内のテキストは翻訳せず保持 - C++固有の用語(`std::uncaught_exceptions()`、`FTM`、`__cpp_lib_uncaught_exceptions`など)は翻訳せず保持 翻訳内容: - `cleanups` → `クリーンアップ` - HTMLタグ、属性、` `、`
`、``タグ内のテキストは翻訳せず保持
- C++固有の用語(`std::allocator_traits::is_always_equal`、`noexcept`、`FTM`など)は翻訳せず保持
- 書式と構造は完全に維持
翻訳内容: - "Feature-testing macro:" → "機能テストマクロ:" - "Yes" → "はい" - C++固有の用語(std::unordered_map::try_emplace、std::unordered_map::insert_or_assign、FTM、N4279など)は翻訳せず保持 - HTMLタグ、属性、コード関連の要素は完全に保持 翻訳内容: - "FTM" → "機能テストマクロ"(Feature-testing macroの訳) - "Feature-testing macro" → "機能テストマクロ" - "Yes" → "はい" - その他のC++固有の用語(std::bool_constant、__cpp_lib_bool_constantなど)は翻訳せず保持 - HTMLタグ、属性、コード内のテキストは完全に保持 翻訳内容: - "FTM" → "機能テストマクロ"(Feature Testing Macro) - "Feature-testing macro" → "機能テストマクロ" - "Yes" → "対応" - HTMLタグ、属性、C++固有の用語(std::as_const、__cpp_lib_as_constなど)は翻訳せず保持 - 数値、バージョン情報、コード関連のテキストはそのまま保持 翻訳内容: - `Feature-testing macro:` → `機能テストマクロ:` - `std::clamp()` と `FTM`、`P0025R1`、`N/A` はC++固有の用語のため翻訳せず - HTMLタグ、属性、コード内のテキストは完全に保持 - 数値、バージョン情報はそのまま維持 翻訳内容: - `Feature-testing macro:` → `機能テストマクロ:` - `Yes` → `対応` - HTMLタグ、属性、C++固有の用語(`std::apply`、`FTM`、`__cpp_lib_apply`など)は翻訳せず保持 - 数値、コード、リンクテキストはそのまま維持 翻訳内容: - `FTM` → `機能テストマクロ` - `Feature-testing macro` → `機能テストマクロ` - `Yes` → `対応` - C++固有の用語(`std::sample`、`__cpp_lib_sample`、`P0220R1`など)は翻訳せず保持 - HTMLタグ、属性、コード内のテキストは完全に保持 翻訳内容: - "and range access" → "および範囲アクセス" - "Yes" → "対応" - HTMLタグ、属性、 内のテキスト、C++固有の用語(constexpr, std::reverse_iterator, std::move_iterator, std::array, FTMなど)は翻訳せず保持 - 書式設定と構造は完全に維持 翻訳内容: - `FTM` → `機能テストマクロ` - `Feature-testing macro` → `機能テストマクロ` - `Yes` → `はい` - `N/A` → `該当なし` C++固有の用語(`constexpr`, `std::atomic`, `is_always_lock_free`など)とHTMLタグ、コードブロックは翻訳せず、元のフォーマットを保持しています。 翻訳内容: - "FTM" → "機能テストマクロ" (Feature-testing macro) - "Feature-testing macro:" → "機能テストマクロ:" 注意事項に従い、以下の要素は翻訳せず保持しました: - HTMLタグと属性 - ` `, `
`, ``タグ内のテキスト(該当なし)
- C++固有の用語(`std::optional`, `__cpp_lib_optional`など)
- バージョン番号、コード値、技術的な識別子
翻訳内容: - `Feature-testing macro:` → `機能テストマクロ:` - `std::variant`、`FTM`、`P0088R3`、`N/A` はC++固有の用語のため翻訳せず - HTMLタグ、属性、コード内のテキストは完全に保持 - 数値、バージョン情報、リンクは変更なし 翻訳内容: - "FTM" → "機能テストマクロ"(Feature-testing macroの訳) - "Feature-testing macro" → "機能テストマクロ" - "Yes" → "対応" - HTMLタグ、属性、
タグ内のテキストは翻訳せず
- C++固有の用語(std::make_from_tuple()、__cpp_lib_make_from_tupleなど)は翻訳せず
- 元の書式と構造を完全に保持
翻訳内容: - "Feature-testing macro:" → "機能テストマクロ:" - "Yes" → "はい" - "N/A" → "該当なし" 注意事項: - HTMLタグ、属性は一切翻訳せず保持 - C++固有の用語(`std::has_unique_object_representations`、`__cpp_lib_has_unique_object_representations`など)は翻訳せず - 数値、バージョン情報、リンクテキストはそのまま保持 - 書式設定は完全に維持 変更点: - 「and」を「および」に翻訳 - 「Yes」を「はい」に翻訳 - HTMLタグ、属性、C++固有の用語(std::gcd(), std::lcm(), FTM, N/Aなど)は翻訳せず保持 - 数値、コード、マクロ名はそのまま保持 翻訳内容: - "FTM" → "機能テストマクロ" (Feature Testing Macro) - "Feature-testing macro:" → "機能テストマクロ:" - "N/A" → "該当なし" 注意点: - HTMLタグ、属性、C++コード(`std::shared_ptr `など)は翻訳せず保持 - C++専門用語はそのまま維持 - 書式設定は完全に保持 翻訳内容: - "FTM" → "機能テストマクロ"(Feature-testing macroの訳) - "Yes" → "対応"(対応状況を示すため) - title属性内の説明文も翻訳 - C++固有の用語(constexpr, std::char_traits)は翻訳せず保持 - HTMLタグ、属性、コード部分は完全に保持 変更点: - `Feature-testing macro:` → `機能テストマクロ:` - `Yes` → `はい` - HTMLタグ、属性、コード内のテキストは翻訳せず保持 - C++固有の用語(`std::scoped_lock`、`FTM`、`__cpp_lib_scoped_lock`など)は翻訳せず保持 - 書式と構造は完全に保持 翻訳内容: - "Feature-testing macro" → "機能テストマクロ" - "Yes" → "対応" - HTMLタグ、属性、C++固有の用語(`std::is_aggregate`、`FTM`、`LWG2911`など)は翻訳せず保持 - 数値、バージョン情報、コード関連のテキストはそのまま保持 - 書式と構造は完全に維持 翻訳内容: - "Feature-testing macro" → "機能テストマクロ" - "Yes" → "はい" - "N/A" → "該当なし" C++固有の用語(std::is_invocable、std::invoke_result、FTM、P0604R0など)は翻訳せず、HTMLタグと属性もそのまま保持しています。
C++17 機能

提案文書

GCC libstdc++
Clang libc++
MSVC STL
Apple Clang*
IBM Open XL C/C++ for AIX*
Intel Parallel STL
Embarcadero C++ Builder*
std::void_t ( FTM ) * N3911 6.1 3.6 19.0 (2015)* 対応 17.1.0 N/A 10.3
std::uncaught_exceptions() ( FTM ) * N4259 6.1 3.7 19.0 (2015)* 対応 17.1.0 N/A 10.3
std::size() , std::empty() および std::data() ( FTM ) * N4280 6 3.6 19.0 (2015)* はい 17.1.0 N/A 10.3
std::allocator_traits::is_always_equal , noexcept クリーンアップ ( FTM ) * N4258 6.1 3.7 19.0 (2015)* 17.1.0 N/A
std::invoke ( FTM ) * N4169 6.1 3.7 19.0 (2015)* 対応 17.1.0 N/A
std::map::try_emplace , std::map::insert_or_assign ( FTM ) * N4279 6.1 3.7 19.0 (2015)* はい 17.1.0 N/A
std::unordered_map::try_emplace , std::unordered_map::insert_or_assign ( FTM ) * N4279 6.1 3.7 19.0 (2015)* はい 17.1.0 N/A
std::pair および std::tuple の改善 N4387 6.1 4 19.0 (Update 2)* はい 17.1.0 該当なし 10.3
std::bool_constant ( 機能テストマクロ ) * N4389 6.1 3.7 19.0 (2015)* はい 17.1.0 N/A 10.3
std::shared_mutex (非時間指定)  ( FTM ) * N4508 6 3.7 19.0 (Update 2)* はい 17.1.0 該当なし 10.3
std::forward_list std::list 、および std::vector に対する最小限の不完全型サポート ( FTM ) * N4510 3.0 3.6 18.0* Yes 17.1.0 N/A
型特性 変数テンプレート  ( FTM ) * P0006R0 7.1 3.8 19.0 (Update 2)* はい 17.1.0 N/A 10.3
論理演算子型特性 ( FTM ) * P0013R1 6.1 3.8 19.0 (Update 2)* はい 17.1.0 N/A 10.3
std::as_const ( 機能テストマクロ ) * P0007R1 7.1 3.8 19.0 (Update 2)* 対応 17.1.0 N/A
std::chrono::duration および std::chrono::time_point のための丸め関数 ( FTM ) * P0092R1 7.1 3.8 19.0 (Update 2)* Yes 17.1.0 N/A
透過的 std::owner_less ( std::owner_less<void> )  ( FTM ) * P0074R0 7.1 3.8 19.0 (Update 2)* はい 17.1.0 該当なし
std::not_fn ( FTM ) * P0005R4
P0358R1
7.1 3.9 19.12* 対応 17.1.0 N/A 10.3
並列アルゴリズムと 実行ポリシー ( FTM ) * ( FTM ) * P0024R2 9* 17
(部分的)*
19.14* 18.0*
std::clamp() ( FTM ) * P0025R1 7 3.9 19.0 (Update 3)* 10.0.0* 17.1.0 N/A 10.3
(nothrow-)swappable 特性 ( FTM ) * P0185R1 7.1* 3.9 19.0 (Update 3)* 10.0.0* 17.1.0 N/A 10.3
ポリモーフィックメモリリソース ( FTM ) * P0220R1 9.1 16 19.13* 15.0.0* 17.1.1 N/A 10.3
std::apply ( FTM ) * P0220R1 7.1 16 19.13* 対応 17.1.0 N/A
サーチャー ( FTM ) * P0220R1 7.1 16 19.13* はい 17.1.0 該当なし
std::sample ( 機能テストマクロ ) * P0220R1 7.1 16 19.13* 対応 17.1.0 N/A
数学的特殊関数 ( FTM ) * P0226R1 7 19.14* 17.1.1 N/A 10.3
constexpr std::addressof ( FTM ) * LWG2296 7.1 対応済み 19.0 (Update 3)* 17.1.0 N/A
constexpr for std::reverse_iterator , std::move_iterator , std::array および範囲アクセス ( FTM ) * 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 該当なし
std::enable_shared_from_this::weak_from_this ( FTM ) * P0033R1 7.1 3.9 19.12* はい 17.1.0 該当なし
3引数のオーバーロード std::hypot ( FTM ) * P0030R1 7.1 3.9 19.14* はい 17.1.0 該当なし
std::byte ( FTM ) * P0298R3 7 5 19.11* はい 17.1.1 該当なし 10.3
std::string_view ( 機能テストマクロ ) * N3921
P0220R1
P0254R2
P0403R1
7.1 4 19.10* (部分的)*
19.11* *
10.0.0* 17.1.0 該当なし 10.3
std::any ( FTM ) * 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 該当なし
スプライシング Maps および Sets ( FTM ) * P0083R3 7 8 19.12* 10.0.0* 17.1.1 N/A
一部の emplace * 関数の戻り値の型が void から参照型に変更 P0084R2 7.1 4.0 19.11* Yes 17.1.0 N/A
std::variant ( FTM ) * 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 ( FTM ) * P0258R2 7.1 6 19.11* はい 17.1.1 該当なし 10.3
std::gcd() および std::lcm() ( FTM ) * P0295R0 7 4 19.11* はい 17.1.0 N/A 10.3
CWG issue 1776 :参照メンバを含むクラスオブジェクトの置き換え( std::launder )( FTM * P0137R1 7.1 6 19.14* 対応済み 17.1.0 N/A
メモリ管理ツールの拡張 ( FTM ) * P0040R3 7.1 4 19.11* 17.1.0 N/A
shared_ptr::weak_type ( FTM ) * P0163R0 7.1 3.9 19.10* はい 17.1.0 N/A
基本文字列変換 : std:: to_chars / std:: from_chars ( FTM ) * 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化 ( FTM ) * P0505R0 7.1 4 19.11* はい 17.1.1 該当なし
std:: shared_ptr < T [ ] > ( 機能テストマクロ ) * P0497R0 7.1 11 19.12* 17.1.1 該当なし
constexpr std::char_traits ( 機能テストマクロ ) * P0426R1 8.1 4 19.14* 対応 17.1.1 N/A
ファイルシステムライブラリ ( std::filesystem )  ( FTM ) * P0218R1
P0219R1
8 7 19.14* 11.0.0* 17.1.1 N/A 10.3
ハードウェア干渉サイズ ( FTM ) * P0154R1 12.1 15 (partial)*
19
19.11* N/A 10.3
std::scoped_lock ( FTM ) * P0156R2 7 5 19.11* はい 17.1.1 N/A 10.3
std::is_aggregate ( FTM ) * LWG2911 7 5 19.15* 対応 17.1.1 N/A 10.3
std::is_invocable , std::invoke_result ( FTM ) * P0604R0 7.1 はい 19.11* はい 17.1.1 該当なし
DR17: std::hash<std::filesystem::path> LWG3657 11.4 17 19.32* 該当なし


C++17 機能


提案文書
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より前のバージョンでも一部機能をサポートしている可能性があります。11.0バージョンでClangの派生版となり、ベースコンパイラの全ての言語機能サポートを継承しました。詳細は Cray/HPE文書S-2179 を参照してください。

* - 星印が付いたセルにマウスを重ねると * 追加のポップアップ注記が表示されます。
DR nn - 「DR」に続く数字 nn は、欠陥報告書が適用される対象C++リビジョンを示します(例:DR20 → C++20)。

外部リンク

1. C++17 - Wikipedia
2. 動作するC++17の例