昨日コメント欄に書いたんだが。
同じことを続けて書くと、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度目までどうにかならないかとも思ったが、どうにもならない気がする。
とはいえ、もっといろいろあるに違いない。