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

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

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日の記事に掲載しました。

最新の画像もっと見る

2 コメント

コメント日が  古い順  |   新しい順
本当、今さらどうしようもない (valp)
2011-09-10 02:55:20
「私ごときが」というよりも、「仕様が承認された」というほうが今さらどうしようもないですね。何年か前だったら、まだ口を出す機会もあった(日本の委員会が一般から意見を集めていたことがあった)のですが。

ラムダ式のは、当初テンプレートからの類推で<>を使っていたが、構文解析がもっと面倒になるということで却下、[]に変更されたという経緯が。<>でも十分いけてないと言われればそれまでですが。

int (...) (int x, int y)は目から鱗でした。でも、戻り値の型が前置なので受け入れられないと思います。(ラムダでない)普通の関数でも戻り値の型を後置して書く構文を導入するほど、戻り値の型を後置することに対する熱望があるようなので。
返信する
コメントに気づかず、失礼いたしました (みぃ)
2011-10-16 23:12:29
私は保守的なので、今までC++0xの成り行きには関心を払っていませんでした。もっと早く気づいたら意見を出したことでしょう。ドット3個 (...) を使う表記は、たぶん誰かが考えて提案してくれたと思います (そう信じたいです)。

(...) 式の表記でも戻り型は後置できます。長くなるので、独立した記事として10月16日に掲載しました。
返信する

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。