鍋あり谷あり

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

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

昨日コメント欄に書いたんだが。
同じことを続けて書くと、1度目と2度目で意味が変わることがある。
私が思いついているのは、昨日書いたのを含めて、以下の2例:

struct foo{  
	foo(){ cout << "default ctor" << endl; }
	void operator()(const foo&){ cout << "()(const foo&)" << endl;}
};

template< int b > struct bar{
	bar(){  cout << "ctor" << endl;  }
};

template< int n >
int operator<( const bar<n> & a, int b ){ cout << "<" << endl; return 0; }

template< int n >
int operator>( int a, const bar<n> & b ){ cout << ">" << endl;return 0; }

const int baz = 1;

void test()
{
  foo(foo); // foo 型の変数 foo を定義
  foo(foo); // foo::operator()(...) を呼ぶ
  bar<baz> bar; // bar<baz> 型の変数 bar を定義
  bar<baz> bar; // operator<(...) と operator>(...) を 呼ぶ
}

どちらも、1度目で型を利用して変数を定義し、それと同時に型の名前を隠す。2度目で先ほど導入した変数を利用する。
3度目までどうにかならないかとも思ったが、どうにもならない気がする。

とはいえ、もっといろいろあるに違いない。