2011-05-12

C++0xネイティブ以外には、どうも分かりにくい記述

今書いているC++0xの参考書は、C++0xを母国語とするプログラマーに向けて書いている。この種類のプログラマーを、C++0xネイティブと呼ぶことにする。C++0xをC++0xとして解説することを目的としていて、他の言語との機能や文法の比較はない。これは、C++03とて例外ではない。つまり、今書いているC++0x本は、C++03からの変更点ということを、特別に意識して書いているわけではない。

この執筆方針は、長期的に見れば、当然である。例えば、今出版されるC言語の参考書には、K&R Cからの変更点とか、BCPLからの変更点などといったことは、まず書かれないだろう。他の言語との比較というのは、その言語自体を学ぶ方法としては、あまり役に立たない。何故ならば、それは単によく似た機能であって、同じではないからだ。

例えば、今、「C++0xのラムダ式とJavascriptの関数リテラルは基本的に同じだ」と言えば、C++0xネイティブとJavascriptネイティブの両陣営から総攻撃を受けるだろう。何故ならば、この二つは全く別の機能だからだ。

とはいえ、本書の対象読者は、前提条件として、C++をある程度理解していることが求められる。今C++をある程度理解している者とは、C++03をある程度理解している者である。そこで、C++03とC++0xの違いが気になるのは当然だ。

C++03からの差分という形で説明すれば、とりあえず短期的には分かりやすい。しかし、今K&R Cを教えるのが時代遅れなように、C++03を教えるのも、時代遅れである。そもそも、私はすでに、C++03のコードが書けなくなってしまっている。C++0xネイティブの本を執筆する者として、当然の心構えである。C++03はもはや劣った言語であり、今更使うべきではないのだ。

例を挙げると、コンストラクターのデリゲートがある。これは、劣ったC++03プログラマーからすると、新機能である。しかし、C++0xネイティブの視点から見れば、単に従来のメンバー初期化子と、何ら変わることはない。したがって、別にわざわざ特別に章節をたてて説明するほどのものでもない。

しかし、コンストラクターのデリゲートを、メンバー初期化子と同じものとして解説するのは、やはり大多数の非C++0xネイティブからすれば、分かりにくいのではないか。

No comments: