現行ドラフトの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:
Post a Comment