鍋あり谷あり

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

私には一生わかりそうにない C++

私の無知をさらけ出しつつしつこく続けるこのシリーズ。何回目だろ。
今回は無能もさらけ出してオーバーロードの解決:

template< typename t > void foo( t );
template<> void foo( double ){  cout << "template<> void foo(double)" << endl;  }
void foo( double ){  cout << "void foo(double)" << endl;  }

void test()
{
  foo(1.0); // void foo( double ); が呼ばれる。
}

コンパイルエラーかリンクエラーになると思っていたんだが、コンパイルもリンクもできて、非template版が呼ばれるのが正しいらしい。
知らなかった。
もう一つ:

template< typename t > void bar( t );
template<> void bar( double ){  cout << "template<> void bar(double)" << endl;  }
template<> void bar( double & ){  cout << "template<> void bar(double &)" << endl;  }
template<> void bar( const double & ){  cout << "template<> void bar(const double &)" << endl;  }

void test()
{
  double d=1.0;
  double & r = d;
  const double & cr = d;
  bar( d );
  bar( r );
  bar( cr );
  bar( (double &)d );
  bar( (const double &)d );
}

全部 bar(double)が呼ばれる。たぶん、これで仕様通り。よーく考えると、ああそうか、という気にもなれる。かもしれない。
最近ちょっぴりオーバーロードの解決ルールに対する理解が深まったんだが、完璧に理解できる日が来るような気は全くしない。あまりにも難しいと思う。

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