Вариативное вычитание шаблона с использованием псевдонима типа

У меня есть такая программа:

template<typename ...Args>
using Function = void(*)(Args *...);

template<typename ...Args>
void DoThing(Function<Args...> func) { }

void IntFunction(int *i) { }

int main(int argc, char *argv[]) {
DoThing(IntFunction);
}

Когда я запускаю программу, я получаю эту ошибку

$ clang++ -std=c++14 template.cpp
template.cpp:12:3: error: no matching function for call to 'DoThing'
DoThing(IntFunction);
^~~~~~~
template.cpp:7:6: note: candidate template ignored: substitution failure [with Args = int]
void DoThing(Function<Args...> func) { }
^
1 error generated.

Но если я скомпилирую его с помощью g ++, я не получу никаких ошибок.

Похоже, что clang испытывает проблемы с определением параметров шаблона переменной при использовании в псевдониме типа. Если я заменю переменные параметры стандартными, то я больше не получаю ошибку.

Какой компилятор дает мне правильный результат? И почему бы мне не позволить это сделать?

4

Решение

Может быть уменьшено до

template <typename... T>
using funptr = void(*)(T...);

template <typename... T>
void f(funptr<T...>) {}

template void f(void(*)());

Это действительный код; если мы заменим funptr<T...> благодаря соответствующему расширению пакета, Clang внезапно перестает жаловаться.

Отмечено как # 25250.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]