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:

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.