C++1z 古くなった機能を非推奨化

C++1zから、標準ライブラリのいくつかの機能が非推奨となります。非推奨となった機能は将来のバージョンで削除される可能性がありますのでご注意ください。

std::iteratorクラス

自作イテレータを作るときに基本クラスとして使用するstd::iteratorクラスですが、これを使ってもイテレータを定義するのはあまり簡単になりませんでした。

このクラスを使用することによって問題がより複雑になってしまうケースもありましたので、非推奨となります。

Boost.Iteratorのようなイテレータを簡単に定義するための新たな仕組みは提供されませんので、標準ライブラリの範囲では、イテレータは最初から最後まで自分で定義することになります。

std::allocatorクラスのいくつかのメンバと、std::allocator<void>

C++11からアロケータの中間インタフェースとデフォルト実装を提供するstd::allocator_traitsクラスが導入されました。それにともない、std::allocatorの多くの機能はいらなくなりました。

そのため、std::allocatorクラスの以下のメンバは、非推奨となります:

また、rebind操作のために必要だったstd::allocator<void>も、std::allocator_traitsの機能でまかなえるようになったので、この特殊化も非推奨となります。

std::is_literal_type型特性

constexprで使用できる型が、C++のバージョンアップにつれて増えていっています。そのうち何でも(もしくはほとんどの型を)扱えるようにする予定のため、この型特性は非推奨となります。

この型特性がほんとうに必要にならなくなるくらいに何でもconstexprで扱えるようになったときに、この機能は削除されます。

temporary buffer関係

std::get_temporary_buffer()関数とstd::return_temporary_buffer()関数は、関数内での一時的なメモリ確保のために、最適化されたメモリ確保の仕組みを提供することを期待して定義されましたが、実際には誰も特別視せず、誰も使いませんでした。

将来的にスタックからメモリ確保をするdynarrayといった仕組みが検討されていますが、temporary buffer関係の現在のAPIは設計として例外安全性やRAIIといったものが考慮されていないため、dynarrayが入ったとしてもtemporary buffer APIの内部を改善することはできないと判断され、非推奨となります。

std::raw_storage_iteratorクラス

未初期化メモリを指すイテレータから、オブジェクトを構築していく出力イテレータstd::raw_storage_iteratorクラスですが、オブジェクトを構築していくのであれば、アロケータとの連携ができることが重要となります。

std::raw_storage_iteratorはそのような用途には適さないということで、非推奨となります。

参照

お断り

この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。