USAのハワイ州コナで開催された冬季の会合において、ISO C++委員会はC++17に関する作業に決着を付けた、とHerb Sutter氏は記した。以下は主な機能について簡単にまとめたものである。
コナにおける会合は大部分が正会員からのレビューコメントへの対応とバグ修正を目的としたものだったため、新しい機能の提供は多くはなかったが、特別にstd::byte
という新しい型が、メモリーにバイト単位でアクセスするプログラムを流れるように記述するために付け加えられた。このようなことは現在はchar
、signed char
、もしくはunsigned char
のどれかを用いて行われているが、これらの使用は文字や演算操作がサポートされている型であるため若干理想的ではない。これに対してstd::byte
は分離されており、専用の型である。
他の特筆すべきC++17の新しい機能は以下のようなものがある。
-
Lambdaが
constexpr
の内部で使用可能となり、このことで既存の制限が撤廃される。constexpr
によりコンパイル時に評価可能なオブジェクトや関数等を宣言することが可能であり、高等なテンプレートパラメータや配列サイズ指定子を提供することを可能とする。コンパイラは宣言された通りに使用ができるようにするために、所与の要件によりconstexpr
オブジェクトもしくは関数をコンパイルすることを保証する。 -
Lambda内で
*this
を捕捉することが可能となり、これは並列コード内やstd::future
を使用する場合には大きな違いを産む。なぜなら、現在はlamdaが実行される時にもthis
がまだ有効であるという保証がないからである。 -
定義・未定義のいずれも取りうる値の表現を取り扱うために
std::optional
を通じてOptionalの使用が可能になった。C++の用語によると、optionalはオブジェクトの初期状態を管理するラッパーである、ということだ。 -
std::variant
を通じてUnion型が利用可能になる。これにより、“floatもしくはlong integerのいずれか”のような型を定義できるようになった。 -
コンストラクタにおいてクラスのテンプレート引数を推論することができるようになり、単に以下のように記述することができるようになる。
auto lock = std::lock_guard(mut_, r1);
従来は下記のように記載する必要があった。
std::lock_guard<std::shared_timed_mutex, std::shared_lock<std::shared_timed_mutex>> lck(mut_, r1);
-
テンプレートにおいて型ではないパラメータから推論できるようになり、例えば以下のようなことが可能となる。
template <auto v> struct S; // type of v is deduced`
C++17の新機能の一覧はここにその全てを記載できないほど長い。Stack Overflowのこの解答で簡潔なまとめが提供されている。これにはコナでの最近の会合の結果の反映が行われており、委員会の公式文書へのポインタが含まれている。
Rate this Article
- Editor Review
- Chief Editor Action