クラステンプレートの部分特殊化

部分特殊化したときのtypename Tは何型なのか?

//
template<typename T>
class A
{
  vector<T> v_;
};

// 引数がポインタの場合
template<typename T>
class A<T*>
{
  vector<T*> v_;
};

// 引数がT constの場合
template<typename T>
class A<T const>
{
  //vecotr<T const> v_ // これはill-formed
  vector<T> v_;
};

int main()
{
  A<int>       a1;   
  A<int*>      a2; 
  A<int const> a3;

  //A<int const*> a4;
  //A<int *const> a5;
  //A<int const*const> a6;
}

どうやら、部分特殊化の条件に当てはまったときの差分が
T型に割り当てられるようです

A<const int>は特殊化条件A<T const>に当てはまりT=intになり
A<int*>は同様にA<T*>に当てはまりT=intになる

したがって、部分特殊化条件で用いたキーワードは型引数から削げ落ち、
もともとのピュアな型になるようです

http://melpon.org/wandbox/permlink/ovXuVE5RRN5S2dt8