みぃちゃんの頭の中はおもちゃ箱

略してみちゃばこ。泣いたり笑ったり

C++満身創痍

2011年09月05日 23時30分11秒 | IT・デジタル
C++0xについて、少し調べてきました。

うちの会社では、ソフトウェア開発にC++を使っています。プログラミング言語は、当初設計された後も、技術の進歩や時代の変化に合わせて改訂が加えられます。C++も、次世代の仕様としてC++0xが練り上げられています (つい最近、仕様が承認されたようです)。

C++0xをざっと見て思いました。

ますます醜くなったなぁ。

「見にくい」ではありません。見た目が悪くなったという意味の「醜い」です。

C++は、新しい概念を取り込むために、新しい記法を取り入れています。しかし、C++の新しい記法にはCのような美しい整合性がなく、本当に「記号」になってしまっています。

例えば、C++の初期に参照が導入されました。
int &x;
このような記号的な表記が、仕様が改訂されるごとに増え続けています。

Cでは、記法と意味に整合性がありました。例えば、
int *p;
と宣言すれば、pはint型のポインタ (int *型) になります。この宣言において、int *pという記述はint (*p) つまり*pがint型であると読むことができ、型の意味と記述方法が見事に整合していました。一方、C++の参照宣言をint (&x) と読んだところで、&x (xのアドレス) がint型であるという解釈は成立しません。&は単なる記号になり下がっています。純粋仮想関数も、もともとの記号の意味とかけ離れています。
virtual int function(int) = 0;


これと似た、単なる記号としての書き方が、C++0xでも新たに導入されています。例えば、ラムダ関数は以下のように定義します。
[ ] (int x, int y) -> int { /* 本体 */ }
関数の定義に [ ] や -> が使われる光景を異様だと感じるのは私だけでしょうか。
[&, z] (int x) { /* 本体 */ }
もう、何でもありの世界です。C++は、いつの間にか つぎはぎだらけになってしまいました。満身創痍 (そうい) で痛々しい限りです。見るに耐えません。

従来の記法と整合する書き方はできないものでしょうか。

C++では ... (ドット3個) で省略を表すことになっていますから、先ほどの例
[ ] (int x, int y) -> int { /* 本体 */ }
の代わりに
int (...) (int x, int y) { /* 本体*/ }
と書けば、関数ポインタ
int (*) (int, int)
とよく似た表記になります。ラムダ導入子 [ ] に変数リストを書く必要がある場合は、予約語usingを使用して、
int (...) (int x, int y) using variable-list { /* 本体*/ }
でいかがでしょう。

私ごときが わめいても、仕方ないか。

(10月16日追記) 関数名の位置に ... を記述する方式で戻り型を後置するための表記案を、10月16日の記事に掲載しました。