2012-04-04

clangを使うべし

tupleのネスト

template parameter packを固定長のtemplate parameter listに展開するのは、gcc 4.6では未実装である。ただ、gccのエラーメッセージが、これを正しく判定できない場合がある。

template < typename T1, typename T2 >
struct A { } ;

template < typename T, typename ... Types >
void f( T, Types ... )
{
    A< T, Types ... > a ;
}

int main(int argc, char* argv[])
{
    f( 0, 0 ) ;
}

この場合は正しく未実装だというコンパイルエラーになるが。

template < typename T1, typename T2 >
struct A { } ;

template < typename T, typename ... Types >
void f( Types ... )
{
    A< Types ... > a ;
}
 
int main(int argc, char* argv[])
{
    f( 0, 0 ) ; 
}

この場合は、一見して訳のわからないエラーメッセージが吐き出される。

4.7では確か実装されていたはずだが、なんにせよ、今やC++コンパイラーはclangを使うべきである。gccの栄光は過去のものになった。

No comments: