C++0x 標準ライブラリ完全解説 〜 No.00 Introduction

はじめに

現在 FDIS 制定に向けて着々と作業が進められてる C++ の次世代規格、通称 C++0x では、
今までの C++ で使いにくかった部分を、より便利に扱えるよう、様々な改良が行われています。
この改良は、言語コア部分の改良のみにとどまるものでは当然 なく、
標準ライブラリも、今までよりずっと充実したものになるよう、大幅に改良されています。


しかし、そんな C++0x のライブラリを解説した記事は、
C++0x になって新しく増えた部分に対する紹介記事こそありますが、
現行規格である C++98/03 の部分も含めた上で、ライブラリの全体にわたって
そこそこ詳細に説明するようなものは、少なくとも日本語は、今まで存在しませんでした。


勿論、今までは、(そして今でも、) C++0x はあくまで草案の状態であり、
C++0x に興味のある人は、現行規格をある程度 把握した上で C++0x について調べる、
というのが暗黙の了解としてあった訳ですから、差分のみの紹介でも問題はなかったのですが、

VC++10 や gcc4.x といった、 C++0x を実装したコンパイラが世に出回り、
また C++0x の規格自身も、今年には FDIS を出せそうな程度には固まってきた現状においては、
そろそろ C++0x の標準ライブラリに対する、まとまった解説記事も欲しくなってくるところ。


そこで本 blog では、 C++0x の標準ライブラリについて、現行規格である C++98/03 の内容も含め、
その中身や関連する C++0x の構文、 Boost のライブラリも合わせて、そこそこ詳細に解説する記事を、


C++0x 標準ライブラリ完全解説」


と銘打って、シリーズで紹介していくことにします。

解説方針

では実際に解説に移る、その前に、どのように解説していくかに、軽く触れておきます。


というのも、解説を厳密に、しっかりした形で行おうと思った場合、
それは 単なる規格の和訳、の劣化したものなってしまうからです。
それはそれで需要はあるかもしれませんが、それを読むくらいなら、
規格の原典にあたった方が手っ取り早いですし、また正確なのは間違いないでしょう。


ですので、今回の解説にあたっては、厳密に規格の内容を記し、注釈する、というのではなく、
若干の不適切さは目をつぶりつつ、大事なことのみを、重点的に、噛み砕いた上で解説していこうと思います。


特に、

  • 厳密な要求条件( Requires )
  • 例外指定に関する細かい条件( noexcept(Cond)
  • 効果、戻り値、その他に関する厳密な情報( Effects, Returns, Remarks )

といった事柄は、軽く触れる程度にし、それらの厳密な情報は、
各々で規格を当たってもらう、という感じで進めていきたいと考えています。


勿論、筆者としては、規格が手元になくても読めるような記事を目指すつもりではあります。
が、やはり解説記事という性質上、情報の取捨選択は行わざるを得ないですし、
筆者自身も規格を完全に理解している、というわけではないので、
もし正確な情報が必要な場合には、各自できちんと規格を調べてください、ということで、
その点だけはどうぞよろしくお願いします。

紹介順序

さて、では実際に、どのように解説を進めていくか、大雑把な方針を書いていきましょう。


C++0x の標準ライブラリは今のところ*1、大きく分けて以下のライブラリから構成されています:

  • Language support library (Clause 18)
  • Diagnostics library (Clause 19)
  • General utilities library (Clause 20)
  • Strings library (Clause 21)
  • Localization library (Clause 22)
  • Containers library (Clause 23)
  • Iterators library (Clause 24)
  • Algorithms library (Clause 25)
  • Numerics library (Clause 26)
  • Input/output library (Clause 27)
  • Regular expressions library (Clause 28)
  • Atomic operations library (Clause 29)
  • Thread support library (Clause 30)

当解説記事は、これらのライブラリを解説していくわけですが、
その順番は、規格の順のとおり Language support library から進める、というわけではありません。


というのも、最初の二つ、 Language support library と Diagnostics library は、
普通に C++0x を使う上で、直接的に使うようなことは少なく、
また、正直あまり面白いライブラリというわけでもないので、
それよりも実際に使用する頻度の高いライブラリを先に回しておいたほうがいい、と判断したからです。


では、どのように進めていくかというと、
具体的には、まず 20 General utilities library [utilities] から、
C++98/03 でも存在していたけれど、 C++0x で一気に存在感を増した、

の三ヘッダを、最初にざっと説明していきます。


は、 C++98/03 では実質的に std::pair のみが定義されたヘッダで、
その std::pair も、 std::map 以外ではイマイチ使われませんでしたが、
C++0x では std::swapstd::move, std::forwardstd::declval といった有用な関数が定義され、
また既存の std::pairRange-based for syntax によって大きく存在感を増した関係で、
今や C++0x でコードを書く上で、欠かすことの出来ないものになっています。


これは も同様で、
には std::unique_ptrstd::shared_ptr
には std::functionstd::ref といった、
C++0x でのコーディングに必要不可欠な記法が割り当てられているため、
まずはそちらを解説し、 C++0x に対する基礎的な理解を固めていくことにします。


そして、これらの基礎的なライブラリ群を一通り解説した後は、
C++0x で更に強力になった とコンテナ周りのライブラリをざっと説明した後は、
といった C++0x の新しいライブラリ群を説明したり、
あるいは といった基礎の基礎を改めて説明するなど、
適当に行き当たりばったりな感じで進めていきます。


この辺りは実際の所、まだ特に何も考えていないので、
基礎的な部分を解説し終わった後に、また改めて方針を策定する、という感じで良いかも知れません。
いずれにせよ、最初のうちは基礎的なライブラリを紹介する、ということで、
若干 退屈な感じになるかも知れませんが、退屈さを感じさせないよう、書いていきたい次第です。

おわりに

最後に、解説記事を読む際、参考になるかもしれないリンクを数点、あげておきます。


まずは、なんといっても C++ 標準化委員会はチェックしましょう。

http://www.open-std.org/jtc1/sc22/wg21/

最新のドラフトはここからダウンロードできます。
自分で読むつもりはなくても、ダウンロードしておいて損にはならない筈。


日本語の解説記事が欲しい場合には、

といった blog が参考になります。


C++0xの言語拡張まとめ(※随時更新) - Faith and Brave - C++で遊ぼう には、 C++0x の新機能が分かりやすく列挙されているので、
C++98/03 は知ってるから 手っ取り早く C++0x を知りたい、という場合には、
まずそちらを参照すると幸せになれます。


本の虫 は C++0x の最新の動向を知りたい場合に役立ちます。
また、 rvalue reference に対する解説記事など、かっちりした解説も多く、
C++0x についてしっかりと理解したい、という場合には、記事を検索してみると良いと思います。

*1: N3225 現在