2010-01-17

文字列リテラルのconst性について

C++0xでは、文字列リテラルから非constなポインタへの変換はできない

私は、このような汚いworkaround的な仕様がC++から、またひとつ減ったことを非常に喜んでいる。

しかしこれは、既存のC++の参考書を、軒並みdeprecatedにしてしまうのではなかろうか。なぜならば、私の記憶する限り、既存のC++の参考書のかなりが、文字列リテラルを、非constなポインタに代入していたからだ。そのような参考書のサンプルコードは、C++0x準拠のコンパイラでは、コンパイルすらできないのである。

いったい、そのような参考書は、責められるべきなのだろうか。

歴史をみてみよう。文字列リテラルは要素数nのconst charの配列(array of n const char)だというのは、そもそも、n0389で提案されている。これは、1993年にリリースされたペーパーだ。文字列リテラルをconstにし、互換性のため、暗黙的にconstを消し去ることを許可しようというものだ。

ということは、これ以降に出版されたC++の本は、言い訳できないはずだ。1993年のn0389リリース以降、すでにドラフト規格は、文字列リテラルはconstであると規定していた。少なくとも、1994年以降のC++本で、何も説明せずに、文字列リテラルを非constなポインタに代入している参考書は、規格を知らない浅はかな人間によって書かれた参考書である。

さて、手元にあるC++の参考書を見ると、どれも、確実に1994年以降に書かれているにも関わらず、痛々しく失敗している。

その中で、唯一、Nicolai Josuttisによって書かれた、Object-Oriented Programming in C++だけは、constなポインタに代入している。しかも、文字列リテラルがconstであり、古いCのコードとの互換性から、非constなポインタに変換できるということまで、解説しているのである。

この本は、全くの初心者にもおすすめできる入門書である。しかも文字列リテラルはconstであるということまで解説している。さすがである。

最も、これは当然だとも言える。なぜならば、Nicolai Josuttisは、非常に有名なC++標準化委員会のメンバーだからだ。彼の所属は、Library Working Groupである。

この本のまえがきは、引用する価値がある。

It took a long, long time to produce this book, but now it is done.

この本を書くには、とても、とても長い時間がかかった。しかし、やり遂げた。

しかも、この本のページ数は、わずかに600ページ。そしてこの品質。これでは、C++0x本を書くのに、たったの800ページでは、ページ数が足りないなどと嘆くのは、言い訳にしかならぬ。なんという事だ。

3 comments:

Anonymous said...

u""とかu8""とかとの絡みでひどいカオスになるから付き合いきれないということで仕方なく削除になったようですね

しかしこんな互換性インパクトのある変更の話題をなぜ今まで誰も取り上げてなかったのか

tiger said...

せめるも何も、const なんてキーワード、後付だからしょうがないです。実際、自分の感覚では、const なにそれ?な時代もあったし…。(それを言い出せば、class?なにそれ?な時代もあったんですが…)

江添亮 said...

規格的に考えると、constは、最初Bjarne Stroustrupによって提案され、
C言語に取り入れられました。C++でもC with Classesでもなく、C言語なのです。
ANSI C以前の話です。

まあ、現実のコンパイラが、constをまともにサポートするのはだいぶあとのことですし、
いまでもCは、強い静的なconst性についてはおざなりですが。