12

以下は標準によって完全に定義されていますか?

#include <iostream>

template <unsigned int... Values, class... Types>
void f(Types&&... values)
{
    std::cout<<sizeof...(Values)<<" "<<sizeof...(Types)<<std::endl;
}

int main()
{
    f<7, 5>(3);
    return 0;
}

下でうまくコンパイルされますg++ 4.8が、それは正常なのだろうか。

4

1 に答える 1

2

ISO C++ 標準の現在のワーキング ドラフト14.1 (11)から:

関数テンプレートのテンプレート パラメーター パックの後に別のテンプレート >パラメーターが続いてはなりません。ただし、そのテンプレート パラメーターが関数テンプレートのパラメーター タイプ リストから推定できるか、または既定の引数を持っている場合を除きます。

あなたの場合、「タイプ」は関数パラメーターパックであり、「値」はテンプレートパラメーターパックであり、常に関数パラメーターパックを続けることができます。また、このコードは同じ理由で機能します。

#include <iostream>

template <class... Values, class... Types>
void f(Types&&... values)
{
    std::cout<<sizeof...(Values)<<" "<<sizeof...(Types)<<std::endl;
}

int main()
{
    f<int, float>(-3, 5);
    return 0;
}
于 2014-03-02T09:44:22.377 に答える