Рассмотрим следующий код:
#include <iostream>
#include <type_traits>
template <typename T>
class A
{
public:
// Allow func to be called if T is the const version of T2
// e.g., T is 'int const' and T2 is 'int'
template <typename T2,
typename = typename std::enable_if<
std::is_same<T, T2 const>::value>::type>
void func(A<T2> const &)
{
std::cout << "Conversion" << std::endl;
}
// Allow func to be called for same version of T
void func(A const &)
{
std::cout << "No conversion" << std::endl;
}
};
int main()
{
A<int const> a;
a.func(A<int const>{});
return 0;
}
Этот код при компиляции с G CC -8.3 компилирует и выдает вывод No conversion
- он выбрал версию func
, которая не использует std::enable_if
. Однако, если я закомментирую вторую версию func
, она все равно будет скомпилирована и теперь выдаст вывод Conversion
. Другими словами, обе версии func
в A
могут использоваться для этого метода. Учитывая, что обе перегрузки являются жизнеспособными, какое конкретное правило c используется компилятором для выбора func(A const &)
поверх другой версии (func(A<T2> const &)
)?