Это похоже на вопрос , но более конкретный случай. На этот раз никакой компилятор не работает.
template<class T>
struct nondeduced
{
using type = T;
};
template<class T>
using nondeduced_t = typename nondeduced<T>::type;
template<class... T, class U>
void f(void(*)(nondeduced_t<T>..., U)) {}
void g(int, char) { }
int main()
{
f<int>(g); // error?
}
В приведенном выше примере пакет параметров T
не может быть выведен, но компилятор должен иметь возможность выводить U
после явной замены аргументов для пакета T
(т.е. один int
в этом случае).
Ожидается, что вышеизложенное будет работать без трюка nondeduced_t
:
template<class... T, class U>
void f(void(*)(T..., U)) {}
Поскольку пакет параметров T
уже находится в невыводимом контексте в соответствии с
[temp.deduct.type] p5
Невыводимые контексты:
- Пакет параметров функции, который не встречается в конце списка объявлений-параметров.
К сожалению, ни один компилятор, который я тестировал (g++/clang), не принимал код. В частности, что-то вроде ниже работает как на g++, так и на clang.
template<class... T>
void f(void(*)(nondeduced_t<T>..., char)) {}
И снова это не работает на обоих:
template<class... T>
void f(void(*)(T..., char)) {}
Является ли мое ожидание неправильным?