У меня есть следующий фрагмент кода:
template <typename, typename>
struct AAA{};
template<typename ...Args>
void f(AAA<Args...> *) {}
int main() {
f<int, int>(nullptr);
}
Этот код приводит к ошибке компиляции. При компиляции с использованием g++ -std=c++1z
ошибка показывает следующее:
prog.cc: In function 'int main()':
prog.cc:8:24: error: no matching function for call to 'f<int, int>(std::nullptr_t)'
f<int, int>(nullptr);
^
prog.cc:5:6: note: candidate: template<class ... Args> void f(AAA<Args ...>*)
void f(AAA<Args...> *) {}
^
prog.cc:5:6: note: template argument deduction/substitution failed:
prog.cc:8:24: note: mismatched types 'AAA<Args ...>*' and 'std::nullptr_t'
f<int, int>(nullptr);
Используя clang++ -std=c++1z
, ошибка:
prog.cc:8:5: error: no matching function for call to 'f'
f<int, int>(nullptr);
^~~~~~~~~~~
prog.cc:5:6: note: candidate template ignored: could not match 'AAA<int, int, Args...> *' against 'nullptr_t'
void f(AAA<Args...> *) {}
^
1 error generated.
Я запускаю эти выше в среде MSYS2 MinGW-w64. Моя версия GCC - GCC 7.1.0, а моя версия Clang 4.0.0; стандартная библиотека, которую я использую как в GCC, так и в Clang, - это libstdС++, связанный с моим компилятором GCC.
На мой взгляд, вызов шаблона функции foo
имеет явно заданный параметр шаблона, поэтому пакет параметров шаблона и тип аргумента функции уже должны быть указаны. Однако приведенная выше диагностика ошибок показывает, что точный тип параметра функции и аргумент nullptr
не совпадают, что, по-видимому, является проблемой, которая возможна только при выводе аргумента функции. Поэтому мой вопрос: почему возникает такая ошибка? Является ли это просто ошибкой компилятора или стандартом С++ есть некоторые правила, которые указывают, что исходный код просто плохо сформирован?