不思議な世界シリーズじゃなくてすいません。
実は、不思議な世界シリーズをもう一回と思っていたんだが、いいのが思いつかなかった。残念。
で。
代わりに私の知らなかった C++。C++ の言語仕様という海に果てはないのかとさえ思えてくる。
今日は、デフォルト引数。
void foo( int=0 ); void foo( int=0 ){} // エラー
私はこれに十回以上引っかかったことがある。同じ値なんだから書かせろよ。といつも思う。
で。
void foo( int n=0 ){ cout << n << endl; } void test() { void foo( int=1 ); // デフォルト引数を再定義。しかも違う値。でも OK。 foo(); // foo(1)と見なされる }
これが通るのは知らなかった。
通るだけでも驚くが、警告も何も出ないのはどうかと思う。警告ぐらい出してくれ。
テンプレート引数のデフォルト値は、関数スコープには書けないので、上記のようなことは起きないはず。
はずなんだが:
template< int n=0 > struct bar{ bar(){ cout << n << endl; } }; template< int n=1 > struct bar; // g++ だとエラー。エラーになるのが正しいと思う。 template< int n > struct foo{ foo(){ cout << n << endl; } }; template< int n=2 > struct foo; void test(){ bar<>(); // cl だと bar<0>() と見なされる。bar の2度目の宣言は無視されたらしい。 foo<>(); // cl だとエラー。g++ だと foo<2>()だと見なされる。 }
マイクロソフトコンパイラは、テンプレートのデフォルト引数をうまく扱えてないらしい。
南無南無。
#写真と本文は関係ありません