foo == &foo

http://shinh.skr.jp/m/?date=20090122#p02
一貫性のためには、配列を値として扱えるセマンティクスが必要なのでは。配列のoperator [ ]とポインタのoperator [ ]が別の意味でオーバーロードされていること自体は無害な筈。D言語Delphiもそうですし。
逆の方向で、構造化型は全部値としては扱えなくする一貫性の取り方もありでしょうか。

struct t { int x, y; } record1;
//struct t record2 = record1; /* これをエラーにする */
struct t *ps1 = record1; /* structも先頭要素の……は使いにくいので自身へのアドレスと解釈 */
struct t *ps2 = &record1; /* 今までどおり */
int v1 = record1->x; /* operator .は使えなくなるので全部operator -> */
int v2 = ps1->x; /* 今までどおり */

こっちの方がC言語らしい気がしませんか……。
ところでちょっと奥さん聞きましたこの頃都ではstd::arrayって物騒なものが流行っているらしいですわよ本末転倒な世の中ですこと……。