2010-03-29

こんな変更ありかよ

Core Issue 818の解決が、FCDに入るのだが、いやしかしこれは、何の役に立つのだろうか。

template < typename T, typename ... Types >
void f(Types... args, T )


// このコードはill-formed。non-deduce contextのため。
f(0, 0, 0) ;

// FCDにより、well-formedになるコード。
f<int, int, int>(0, 0, 0) ;

ようするに、パラメータパックを、引数リストの最後でなくても、指定出来るようにする変更。ただし、non-deduce contextになる。つまり、argument deductionができないので、明示的に、テンプレート引数を指定してやる必要がある。

何に使うんだろう。こういうことは、できるかもしれない。

// non-deduce contextなので、template parameter packを最後に書かなければならない。
template < typename T, typename ... Types >
void f( Types... , T ) { }

template < typename ... Types >
void g( Types ... args )
{
    f< Types..., int >( args... , 0 ) ;
}

しかし、単に引数の順番という以外の利用方法を、思いつかない。第一、deduceできないのだから、その利用方法が、極端に限られているし、書きにくい。それに、正しいコードを書くためには、argument deductionの、詳細なルールを知っていなければならない。

例えば、以下のコードは、ill-formedである。

template < typename ... Types, typename T >
void f(Types... args, T ) ;

なぜなら、fはnon-deduce contextだからだ。詳しい理由が知りたければ、14.9.2 Template argument deduction [temp.deduct]を熟知する必要がある。こんな微妙すぎる言語仕様、果たして、誰の役に立つというのか。ちなみに、こういうふうに変更した理由は、inconsistentだからだそうだ。いくら言語的にconsistentだとしても、誰も恩恵を受けない言語仕様は、language lawyerはともかく、必要あるのだろうか。

No comments: