C 17は、プログラミング言語C の国際規格ISO/IEC 14882:2017の略称である。
廃止された機能
今回の改定では新機能の追加のみではなく、いくつかの機能が廃止されている。
- トライグラフの廃止。
- 標準ライブラリから、すでに非推奨になっていた
std::auto_ptr,std::random_shuffleを含むいくつかの型や関数、古い関数アダプタが取り除かれた。これらはC 11でstd::unique_ptr、std::shuffle、std::bind、ラムダのような改良された手段に取って代わられた。 - (すでに非推奨となっていた) 記憶域クラス指定子としてのキーワード
registerの廃止。キーワード自体は未使用で予約される。
新機能
言語
static_assertの診断メッセージを省略可能とした。- テンプレートのテンプレートのパラメータに (
classの代わりに)typenameを使えるようにした。 - 初期化リストからの型推論 (
auto) 規則を新設。 - 入れ子の名前空間の定義を
namespace X { namespace Y { … } }等とする代わりにnamespace X::Y { … }と書けるようにした。 - 名前空間や列挙型に属性を書けるようにした。
- 新たに
[[fallthrough]]、[[maybe_unused]]、[[nodiscard]]属性を標準に追加。 - UTF-8 (
u8) 文字リテラル。 - 十六進浮動小数点リテラル。
- 全ての非型テンプレート引数における定数評価。
- 可変長引数テンプレートにおける畳み込み式。
if constexpr(expression)の形式によるコンパイル時の静的if。- 構造化束縛宣言。
auto [a, b] = getTwoReturnValues();のように書くことができるようになった。 if文およびswitch文での初期化子。T型 (トップレベルのcv修飾を無視する) の純粋右辺値式からT型のオブジェクトをコピー初期化および直接初期化するとき、純粋右辺値式からコピーコンストラクタやムーブコンストラクタが呼ばれなくなった。詳細は「コピーの省略」を参照のこと。- over-aligned なメモリ確保に関する拡張。
- クラステンプレートの実引数推定 (Class Template Argument Deduction: CTAD)。コンストラクタの推定ガイドが導入されたことで、
std::pairのようなコンストラクタの引数の型や、(5.0, false) std::make_pair(5.0, false)のようなヘルパー関数テンプレートが必要なくなり、std::pair(5.0, false)のように書くことができるようになった。 - インライン変数により、単一定義規則に反することなくヘッダファイルで変数を定義できるようになった。効果はインライン関数と同様である。
__has_includeでヘッダが利用可能かをプリプロセッサディレクティブで確認できるようになった。__cplusplusの値は201703Lとなった。- 例外指定が関数の型の一部となった。
ライブラリ
以下のヘッダが追加された。
— あらゆる型を保持できるstd::anyクラス— ディレクトリやファイルの操作— 有効または無効な値を保持するstd::optionalクラス— 読み取り専用で所有権を持たずに文字シーケンスを参照するstd::basic_string_viewクラス— 型安全な共用体(union)std::variantクラス
脚注
関連項目
- C 11
- C 14
外部リンク
- The C Standards Committee




