同一个文件中有两个函数
// 函数 1
template <typename S, typename ... SS>
void p(S s, SS... ss){
p(ss...);
}
// 函数 2
template <typename S>
void p(S s){
}
如上:上述代码在编译的时候报错,因为当第一个函数递归到 SS 为空 paramater pack 时,无法调用 p(ss...),但是如果将函数 1 与函数 2 的位置互换,则正常编译。
我的理解是,不换位置时,编译器只看到了函数 1,递归死,报错。换位置后,编译器知道了只有一个模板参数的 p,所以递归时直接用了,这样理解对不对?
另外我想问一下,这是编译器的个人行为,还是 c++标准里有规定的?
另外 http://en.cppreference.com/w/cpp/language/function_template 说:
template<class T, class... U> void f(T, U...); // #1
template<class T > void f(T); // #2
void h(int i) {
f(&i); // calls #2 due to the tie-breaker between parameter pack and no parameter
// (note: was ambiguous between DR692 and DR1395)
}
但是 gcc 也没鸟这条规定?
求解答。