は、コードのこの部分を考えてみましょう:あいまいな呼び出しを再帰的に可変引数テンプレート関数のオーバーロードを呼び出す
template<typename FirstArg>
void foo()
{
}
template<typename FirstArg, typename... RestOfArgs>
void foo()
{
foo<RestOfArgs...>();
}
int main()
{
foo<int, int, int>();
return 0;
}
RestOfArgs
が一つだけの要素({int}
)を持っているとき、それが原因あいまいな呼び出しfoo<RestOfArgs...>();
にコンパイルされません。
しかし、これはエラーなしでコンパイル:
template<typename FirstArg>
void foo(FirstArg x)
{
}
template<typename FirstArg, typename... RestOfArgs>
void foo(FirstArg x, RestOfArgs... y)
{
foo(y...);
}
int main()
{
foo<int, int, int>(5, 6, 7);
return 0;
}
なぜ最初のケースで曖昧さはありますか?
なぜ2番目のケースではあいまいさがありませんか?
私の仮定は、それはとは何かを持っているということです関数の署名がその引数であるという事実と、 ''と' 'はあるケースでは区別できませんが、他のケースでは区別できません。 –
yeputons
[overload_resolution](http://en.cppreference.com/w/cpp/language/overload_resolution)、[Function_template_overloading](http://en.cppreference.com/w/cpp/language/function_template#Function_template_overloading)を参照してください。 ) – Jarod42
@ Jarod42私はそれを見ましたが、私の質問に対する答えはまだ分かりません。 –