不思議な世界シリーズじゃなくてすいません。
実は、不思議な世界シリーズをもう一回と思っていたんだが、いいのが思いつかなかった。残念。
で。
代わりに私の知らなかった 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>()だと見なされる。
}マイクロソフトコンパイラは、テンプレートのデフォルト引数をうまく扱えてないらしい。
南無南無。
#写真と本文は関係ありません