为什么这种替换失败会产生错误?

问题描述

在模板特化中,我有一个带有 enable_if 参数的模板参数,该参数导致 enable_if 没有“类型”成员,因此模板特化应该失败,但不会产生错误

#include <type_traits>


template <typename value_t_arg,typename T = void>
struct underlyingtype
{
    using underlyingtype_t = value_t_arg;
};

template <typename value_t_arg>
struct underlyingtype < value_t_arg,typename std::enable_if<false>::type>
// std::enable_if<false> has no 'type' member,and so substitution should fail,// but no create an error,right?
{
    //using underlyingtype_t = value_t_arg::integral_t;
};

为什么会在此处创建错误

解决方法

您的代码格式错误(无需诊断),因为无论模板参数如何,条件始终为假,这意味着特化对于每个可能的模板参数都是格式错误的。

[temp.res.general]/6.1

程序格式错误,无需诊断,如果:

——不能为模板生成有效的特化......并且模板没有被实例化,......

就本节而言,部分专业化似乎被视为“模板”。