【发布时间】:2020-09-09 05:56:11
【问题描述】:
我知道标题没有多大意义,但代码会解释我的问题。
template<typename T>
void foo(T...) {std::cout << 'A';}
template<typename... Ts>
void foo(Ts...) {std::cout << 'B';}
int main(){
foo(1);
foo(1,2);
}
在阅读续篇之前尝试猜测这个程序的输出:
所以输出是AB
谁能解释为什么 1 个参数函数优先考虑省略号,而 2 个参数优先考虑可变参数模板?
【问题讨论】:
-
你确定第一个函数模板编译了吗?
-
@IgorR。 gcc.godbolt.org/z/67Dgk8
-
@Ayxan 我会说这是一个奇怪的 gcc 错误,但 clang 也可以编译它......令人兴奋。
-
template<typename... Ts> void foo(Ts......)更“有趣”,请阅读foo(Ts..., ...)。 -
@Jarod42 现在只需要解释为什么第一次调用选择了这个重载。
标签: c++ c++11 templates overloading language-lawyer