Учитывая следующее
template <typename T, typename Enable=void>
struct test{};
template <typename T,
typename std::enable_if< some_trait<T>::value >::type >
struct test{};
при условии, что some_trait<T>::value
равно true
, enable_if<T>::type
равно void
, и специализация выбрана.Тем не менее, мой запрос связан с выбором, когда имеет место следующее.
template <typename T,
typename std::enable_if_t< some_trait<T>::value,T>::type >
struct test{};
Когда для enable_if
предусмотрен второй параметр шаблона void, для ::type
выбирается неспециализированный шаблон, дажекогда some_trait<T>::value
равно true
, а ::type
равно T
вместо void
, и поэтому не соответствует значению по умолчанию в основном шаблоне.
Мой вопрос - где в стандартеописан порядок, для которого выбран шаблон, и почему экземпляр test<T,void>
считается лучшим соответствием, чем test<T,T>
.
https://ideone.com/7v4TTS
полный образец:
#include <iostream>
#include <type_traits>
template <typename T,typename Enable=void>
struct test
{
const char* value = "Primary";
};
#if 1// toggle this
template <typename T>
struct test<T,typename std::enable_if< std::is_same<T,T>::value >::type >
{
const char* value = "Specialization";
};
#else
template <typename T>
struct test<T,typename std::enable_if< std::is_same<T,T>::value,T >::type>
{ /// ^
const char* value = "Specialization";
};
#endif
int main() {
test<int> v;
std::cout << v.value << std::endl;
return 0;
}