C++ 在调用时仅指定一些模板参数

C++ 在调用时仅指定一些模板参数,c++,c++14,language-lawyer,icc,template-argument-deduction,C++,C++14,Language Lawyer,Icc,Template Argument Deduction,考虑一小段可变模板代码: #include <type_traits> template<int Dim, class... Idcs> std::enable_if_t<sizeof...(Idcs) == 1> doit(Idcs... idcs) {} int main() { doit<0>(1); } 可以通过更改main()内部的调用来完全指定所有模板参数来解决此问题 doit<0, int>(1); 这很可

考虑一小段可变模板代码:

#include <type_traits>

template<int Dim, class... Idcs>
std::enable_if_t<sizeof...(Idcs) == 1> doit(Idcs... idcs)
{}

int main()
{
    doit<0>(1);
}
可以通过更改
main()
内部的调用来完全指定所有模板参数来解决此问题

doit<0, int>(1);

这很可能是在第19版中修复的icc中的错误:

更多调查显示,icc v18(不编译您的代码)正确地推断出
idc
,而不使用
enable\u if

模板
尺寸(Idcs…Idcs)
{
静态断言(sizeof…(Idcs)==1);
返回…的大小(Idcs);
}
自动测试()
{
return doit(1);//即使在icc v18上也正确返回1
}

@bolev补充道,我还将第一个模板参数类型更改为
int
,因为我无意中包含了一些其他定义了
size\u t
的不相关的头。
doit<0, int>(1);
g++ -std=c++14 myfile.cpp
clang++ -std=c++14 myfile.cpp
icc -std=c++14 myfile.cpp
template<size_t Dim, class... Idcs>
size_t doit(Idcs... idcs)
{
    static_assert(sizeof...(Idcs) == 1);
    return sizeof... (Idcs);
}

auto test()
{
    return doit<0>(1); // correctly returns 1 even on icc v18
}