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

Why does this substitution failure create an error?

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

#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

The program is ill-formed, no diagnostic required, if:

— no valid specialization can be generated for a template ... and the template is not instantiated, ...

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

SFINAE,不是FINAE。为了使编译器对 std::enable_if<false>::type 感到满意,您需要后者,这意味着一些荒谬的事情。