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:

Post a Comment

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.