通过参数启用时 std::enabled_if 如何工作

How does std::enabled_if work when enabling via a parameter

我正在尝试了解 enable_if 的工作原理,并且我了解几乎所有内容,但

中的场景 #3 除外

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";
}

如果 enable_if 中的表达式为真,则选择部分模板特化,因此如果选择:

  1. 为什么在 enable_if 中只是条件而不指示第二个模板参数?
  2. 那么"type*"是什么类型呢?空白* ?如果是,为什么?
  3. 为什么是指针?

why in enable_if is only condition without indicating second template parameter ?

因为默认的void就可以了。

What type is "type*" then ? void* ? if so, why ?

是的,如果 std::is_trivially_destructible<T>::value == true::type 将是 void 类型,这将导致 ::type* -> void*

Why is it pointer ?

所以我们可以很容易地给它一个默认值0


我们使用 std::enable_if 的全部目的是检查某些属性(在这种情况下检查 T 是否可以轻易破坏),如果这些结果是 false 那么我们使用它创建格式错误的代码,从而从重载决议中消除此功能。

如果 std::is_trivially_destructible<T>::value == false::type 将不存在,因此代码格式不正确。在 SFINAE 中,这很方便,因为此过载将不会被考虑用于解析。