首页 > 解决方案 > 为什么这种替换失败会产生错误?

问题描述

在模板特化中,我有一个带有 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;
};

为什么这里会产生错误?

标签: c++template-meta-programmingsfinaeenable-if

解决方案


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

[temp.res.general]/6.1

该程序格式错误,不需要诊断,如果:

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

就本节而言,部分专业化似乎算作“模板”。


推荐阅读