2010-03-10

Template Parameter Packがゼロ個の場合でもpartial orderingで考慮されるか

以下の例は、#1が呼ばれる。

template < typename T >
void f(T, T) { std::cout << "#1" << std::endl ; }

template < typename T, typename ... Types >
void f( T, Types ... ) { std::cout << "#2" << std::endl ; }


int main()
{
    f(0, 0) ;// #1
}

なぜならば、Non-Variadic Templateは、Variadic Templateより、もっと特殊化(more specialized)されるからだ。

では、以下の例はどうだろうか。

template < typename T >
void f(T) { std::cout << "#1" << std::endl ; }

template < typename T, typename ... Types >
void f( T, Types ... ) { std::cout << "#2" << std::endl ; }


int main()
{
    f(0) ;// which?
}

gcc4.5は、#1を呼ぶ。つまり、Non-Variadic Templateの方が、more specializedであると考えているようだ。しかし、この場合、Template Parameter Packは、ゼロ個の型を引数にとる。Template Parameter Packがゼロ個の型を引数にとることは、規格で規定されている。

とすれば、Partial Orderingに、Variadic Templateは、全く関わっていないのではないか。なぜならば、Template Parameter Packは、何も引数をとっていないのだ。関数のシグネチャは、どちらも、int ( int )である。

Partial Orderingの定義を読んだが、どうも今の文面は、何らかの引数(type, non-type, template template parameter(Template Parameter Packを含む) )を引数にとることを想定している。

これは、規格の問題なのかもしれない。

No comments: