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:
Post a Comment