2010-08-29

現行のtemplate aliasの問題

現行ドラフトのtemplate aliasの定義には穴がある。現行の規格を真面目に解釈すると、以下のような記述が可能である。

template < typename T > A = int ;
A<int> a ; // int
A<double> b ; // int

template < typename T > B = struct S { T value ; } ;

B<int> c ; // S::Tはint
B<double> d ; // ODR違反?

Aは、どんなテンプレート実引数を渡そうと、int型になってしまう。Bは、クラスS自体はテンプレート化されていないのに、なぜかTが依存名である。dを定義した時点で、複数のSの定義があることになる。これはODRに違反する。

これはどう考えても望ましくないので、この穴を塞ごうというコメントが出ている。おそらくは、この問題は、次のドラフトまでに修正されるであろう。

なかなか面白かったので取り上げた次第。

No comments: