I'm trying to understand how enable_if works and I understand almost everything except scenario #3 from
https://en.cppreference.com/w/cpp/types/enable_if
template<class T>
void destroy(T* t,
typename
std::enable_if<std::is_trivially_destructible<T>::value>::type* = 0)
{
std::cout << "destroying trivially destructible T\n";
}
if the expression in enable_if is true then partial template specialization is chosen, so if it is chosen:
- why in enable_if is only condition without indicating second template parameter ?
- What type is "type*" then ? void* ? if so, why ?
- Why is it pointer ?
why in enable_if is only condition without indicating second template parameter ?
Because the default void is just fine.
What type is "type*" then ? void* ? if so, why ?
Yes, ::type will be of type void if std::is_trivially_destructible<T>::value == true, this will result in ::type* -> void*.
Why is it pointer ?
So we can easily give it a default value of 0.
All we're using std::enable_if for is to check for certain attributes (in this case checking if T is trivially destructible), if these result in false then we use it to create ill-formed code and thus eliminate this function from overload resolution.
If std::is_trivially_destructible<T>::value == false then ::type will not exist and thus the code will be ill-formed. In SFINAE this is handy since this overload will then not be considered for resolution.
来源:https://stackoverflow.com/questions/51785354/how-does-stdenabled-if-work-when-enabling-via-a-parameter