同一个文件中有两个函数
// 函数 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 也没鸟这条规定?
求解答。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.