考虑以下代码:

#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标准是否说具有固定数量参数的模板函数比具有相同签名的可变参数函数更受青睐?

最佳答案

由于在“单一”版本中使用了第二个enable_if模板参数,因此编译器认为该版本是更专业的模板,可与启用该模板的类型一起使用。
之所以认为它更专业,是因为可以实例化可变参数模板的类型,但不能“实例化”。

一般规则是,在过载解析中,更专业的模板胜过更不专业的模板。

10-04 21:15