Рассмотрим следующую программу:
template <class T> struct A { using X = typename T::X; };
template <class T, typename A<T>::X* = nullptr> void f(T, int);
void f(...);
template <class T> void g(T, int, typename A<T>::X* = nullptr); // #
void g(...);
int main() {
// f(0, nullptr); // error
g(0, nullptr); // ok
}
g(0, nullptr)
компилируется, а f(0, nullptr)
- нет (протестировано в магистрали GCC и Clang на Godbolt ). Кажется, что во время процесса вывода аргумента шаблона #
компилятор не создает экземпляр A<int>
, когда он находит аргумент nullptr
, не соответствующий параметру int
. Где стандарт определяет это поведение?