【发布时间】:2019-05-02 10:06:01
【问题描述】:
考虑以下代码sn-p:
template<typename T, template<typename, typename ...> class A, typename ... Ts>
int a(A<T, Ts...> arg){
return 1; // Overload #1
}
template<typename A>
int a(A arg) {
return 2; // Overload #2
}
template<typename T>
struct S{};
int main() {
return a(S<int>());
}
在使用模板类的实例调用函数a 时,我希望编译器选择更特殊的函数重载#1。根据compiler explorer,clang、gcc 和 intel 直到版本 17 实际上确实选择重载 #1。相比之下,后来的英特尔编译器版本(18 和 19)选择重载 #2。
是代码定义不正确还是最新的英特尔编译器版本有误?
【问题讨论】:
-
用
-O3变成a bit more readable。
标签: c++ templates language-lawyer variadic-templates