Является ли вычет для f1
и f2
неправильно?
template<class... T, class U>
void f1(T..., U){}
template<class... T>
void f2(T..., int){}
int main()
{
f1(1);
f2(1);
return 0;
}
g ++ принимает оба, clang принимает только f2
, а msvc отклоняет оба.
Соответствующая стандартная формулировка:
Когда пакет параметров функции появляется в невыведенном контексте ([temp.deduct.type]), тип этого пакета параметров никогда не выводится.
Невыведенные контексты:
- Пакет параметров функции, который не находится в конце списка-объявления-параметра.
Так кажется, MSVC правильно отвергает и то, и другое?
Означает ли это, что создание экземпляров шаблонов будет некорректным, даже если вы укажете аргументы шаблона явно?
f1<int>(1, 2); // ill-formed?
f2<int>(1, 2); // ill-formed?
Если это так, зачем вообще допускать такие декларации?