鍋あり谷あり

テーマを決めずに適当に書いています。

Cでも不思議な世界 - 2度目は意味が違う

私としては。
昨日書いた件について、悪いのは演算子オーバーロードではなく、

  • foo という名前が一つの文に二度出ているのにエラーにならない*1
  • 関数呼び出しと変数宣言(定義)の文法が区別しにくい
  • template のための括弧が、あらゆる文脈で登場しうる不等号である

の3点だと考えている。
そして、演算子オーバーロードは上記に点に起因する問題をより深刻にしているだけで、原因そのものではない。様に思う。
#というのも。私は演算子オーバーロードが大好きだからだ。だから、java は好きになれない。

というわけで。
演算子オーバーロードのない C言語でも、1度目と2度目で意味が異なるようにすることはできる:

typedef int (foo)( void * );
void test()
{
  foo( * foo ); /* 変数宣言。*/
  foo( * foo ); /* 関数呼び出し。即死する。 */
}

foo(foo); で十分なはずなんだが、なぜか foo(foo); だと、micorsoftコンパイラはエラーにする。エラーじゃないと思うんだが。
#写真と本文は関係ありません。

*1:関数型言語では普通のことだと思うが、C/C++ ではメリットがないと思う