鍋あり谷あり

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

私の知らなかった C++ まだまだ

不思議な世界シリーズじゃなくてすいません。
実は、不思議な世界シリーズをもう一回と思っていたんだが、いいのが思いつかなかった。残念。
で。
代わりに私の知らなかった 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>()だと見なされる。
}

マイクロソフトコンパイラは、テンプレートのデフォルト引数をうまく扱えてないらしい。
南無南無。

#写真と本文は関係ありません