次のコードを検討してください。
#include <iostream>
#include <type_traits>
// Variadic version
template<class... Variadic>
void f(const Variadic&... variadic)
{
std::cout<<"variadic"<<std::endl;
}
// Single version
template<class Single, class = typename std::enable_if<std::is_fundamental<Single>::value>::type>
void f(const Single& single)
{
std::cout<<"single"<<std::endl;
}
// Main
int main()
{
f(); // variadic
f(42); // single : why?
f(std::string()); // variadic
f(42, 42); // variadic
return 0;
}
「single」とマークされた行が(g ++ 4.6.3で)うまくコンパイルされ、オーバーロード解決の問題が発生しない理由がわかりません。c ++ 11標準では、パラメーターの数が固定されたテンプレート関数が、同じ署名を持つ可能性のある可変個引数関数よりも優先されるとされていますか?