C++ 中类型名赋值如何工作 (typename =)?

Twi*_*ard 1 c++ enable-if

我在查看时遇到了这个例子std::enable_if

template<class T,
typename = std::enable_if_t<std::is_array<T>::value> >
void destroy(T* t) 
{
   for(std::size_t i = 0; i < std::extent<T>::value; ++i) {
    destroy((*t)[i]);
   }
}
Run Code Online (Sandbox Code Playgroud)

在模板参数列表中,您可以放置​​非模板化的类/结构。所以当我们删除typename =. 这段代码中的 是什么typename =意思和作用?

Rem*_*eau 5

第二个模板参数typename指示该参数是类型而不是常量值。该参数未指定名称,但=如果调用者未指定类型,则表明它具有默认类型。enable_if_t<...>在本例中,该类型是(aka )的结果std::enable_if<...>::type

std::enable_if有 2 个模板参数。第一个参数采用布尔常量,第二个参数指定成员的类型std::enable_if<...>::type。第二个参数是void默认的。type仅当布尔值为 true 时该成员才被定义,否则当布尔值为 false 时该成员未定义。在本例中,该布尔值是 的结果std::is_array<T>::value

因此,如果T是数组类型,std::is_array<T>::value则 will be true,因此std::enable_if<true, void>::typewill be void,最终模板将是:

template<class T, typename _ = void>
void destroy(T* t) 
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

否则, ifT不是数组类型,std::is_array<T>::valuewill be false,因此std::enable_if<false, void>::type将是未定义的,最终的模板将是:

template<class T, typename _ = [undefined] >
void destroy(T* t) 
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

因此该模板将被禁用,因为它是无效的。