Учитывая следующую программу
#include <iostream>
template<class T> struct id { using type = T; };
template<class T1, class T2>
int func(T1, T2) { return 0; }
template<class T1, class T2>
int func(typename id<T1>::type, typename id<T2>::type) { return 1; }
int main()
{
std::cout << func<int, int>(0, 0) << std::endl;
}
G CC и Clang, обе печатают 1
для этой программы. Гарантированно ли эта программа печатает 1
по стандарту?
Я пытался найти здесь ответ, но не смог его расшифровать. Похоже, что шаблоны функций могут быть эквивалентными и поэтому нарушают ODR, но я не уверен.
Имеет ли значение изменение второго шаблона функции на
template<class T>
using id_type = typename id<T>::type;
template<class T1, class T2>
int func(id_type<T1>, id_type<T2>) { return 1; }
?