C++17

C++17は、プログラミング言語C++国際規格ISO/IEC 14882:2017の正式名称です。この規格は、C++言語に多くの重要な変更と改善を導入し、より現代的で効率的なプログラミングを可能にしました。以下に、C++17で導入された主な変更点と新機能について詳しく説明します。

廃止された機能



C++17では、いくつかの古い機能が廃止されました。これらは、よりモダンな機能への移行を促進し、言語の複雑さを軽減することを目的としています。

トライグラフの廃止: トライグラフは、特定の文字セットで利用できない文字を入力するための古い方法であり、C++17で完全に削除されました。
標準ライブラリの削除: `std::auto_ptr`や`std::random_shuffle`など、非推奨となっていた型や関数、古い関数アダプタが削除されました。これらの機能は、C++11で導入された`std::unique_ptr`、`std::shuffle`、`std::bind`、ラムダ式などのより優れた代替手段に置き換えられています。
記憶域クラス指定子`register`の廃止: `register`キーワードは、変数に対するストレージクラスの指定子としての機能を廃止されました。ただし、キーワード自体は予約されており、将来の使用のために保持されています。

新機能



C++17では、多くの新機能が言語とライブラリの両方に追加されました。これらの機能は、コードの可読性、効率性、および安全性を向上させるのに役立ちます。

言語機能


`static_assert`の診断メッセージの省略: `static_assert`の診断メッセージが省略可能になり、より簡潔なコード記述が可能になりました。
テンプレートのテンプレートパラメータでの`typename`: テンプレートのテンプレートパラメータで`class`の代わりに`typename`を使用できるようになりました。
初期化リストからの型推論: `auto`キーワードを使用する際の型推論規則が改善され、初期化リストからの型推論がより直感的になりました。
入れ子になった名前空間の簡略化: 入れ子になった名前空間の宣言が、`namespace X::Y { ... }`のように簡潔に書けるようになりました。
名前空間と列挙型への属性付与: 名前空間と列挙型に属性を付与できるようになりました。
新しい属性の標準化: `fallthrough`、`maybe_unused`、`nodiscard`属性が標準に追加され、コードの意図をコンパイラに伝えることが容易になりました。
UTF-8文字リテラル: `u8`接頭辞を付与することで、UTF-8エンコードされた文字列リテラルを直接記述できるようになりました。
16進浮動小数点リテラル: 16進数で浮動小数点数を表現できるようになりました。
非型テンプレート引数での定数評価: 非型テンプレート引数での定数評価がすべてのケースで可能になりました。
可変長引数テンプレートでの畳み込み式: 可変長引数テンプレートを使用して畳み込み演算を簡単に記述できるようになりました。
コンパイル時`if`: `if constexpr`を使用することで、コンパイル時に条件付きコードを記述できるようになりました。
構造化束縛: `auto [a, b] = getTwoReturnValues();`のように、複数の戻り値を一度に変数に代入できるようになりました。
`if`と`switch`文での初期化子: `if`文と`switch`文内で変数を初期化できるようになりました。
純粋右辺値からのコピーの省略: 純粋右辺値からのコピーコンストラクタやムーブコンストラクタの呼び出しが省略されるようになりました。これにより、パフォーマンスが向上します。
オーバーアラインメモリの確保: オーバーアラインされたメモリの確保機能が拡張されました。
クラステンプレートの実引数推論(CTAD): クラステンプレートのコンストラクタ引数からテンプレート引数を推論できるようになりました。
インライン変数: ヘッダファイルで変数を定義できるようになり、単一定義規則(ODR)違反を回避できるようになりました。
`__has_include`プリプロセッサ: ヘッダファイルが利用可能かどうかをプリプロセッサディレクティブで確認できるようになりました。
`__cplusplus`の値: `__cplusplus`の値が`201703L`に変更されました。
例外指定が型の一部に: 例外指定が関数の型の一部として扱われるようになりました。

ライブラリ


C++17では、以下のような新しいヘッダと機能が標準ライブラリに追加されました。

``: あらゆる型の値を保持できる`std::any`クラスが導入されました。
``: ディレクトリとファイルの操作を行うための機能が追加されました。
``: 有効または無効な値を保持できる`std::optional`クラスが導入されました。
``: 文字列の読み取り専用ビューを提供する`std::basic_string_view`クラスが導入されました。
``: 型安全な共用体(union)である`std::variant`クラスが導入されました。

これらの変更点と新機能により、C++17はより強力で柔軟なプログラミング言語となりました。これらの新機能と改善は、開発者がより効率的かつ安全なコードを記述するのに役立ちます。

関連項目



C++11
C++14

外部リンク



* The C++ Standards Committee

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。