C++ 在模板初始化过程中,模板参数列表中的false的计算结果是什么?

C++ 在模板初始化过程中,模板参数列表中的false的计算结果是什么?,c++,templates,sfinae,C++,Templates,Sfinae,我刚开始调查SFINAE以了解它是什么。我在关注,而且大部分都是有意义的。但我不知道代码的关键部分在哪里 在第二个enable_if模板参数列表中。有一个false和一个模板类型T参数 template <class T> struct enable_if<false, T> {}; 编译器计算!is_container::value。如果为真,则 template <bool Cond, class T = void> //first param is i

我刚开始调查SFINAE以了解它是什么。我在关注,而且大部分都是有意义的。但我不知道代码的关键部分在哪里

在第二个
enable_if
模板参数列表中。有一个
false
和一个模板类型
T
参数

template <class T>
struct enable_if<false, T>
{};
编译器计算
!is_container::value
。如果为
,则

template <bool Cond, class T = void> //first param is is a bool condition, second param is the return type. 
struct enable_if
{
  typedef T type; //if bool Cond is true, it returns the type.
};
现在,如果计算结果为
false
,则

template <class T>
struct enable_if<false, T>
{};
是替换失败,因为没有
类型
成员。由于替换失败不是错误,编译器只是从重载集中删除then函数

编译器计算
!is_container::value
。如果为
,则

template <bool Cond, class T = void> //first param is is a bool condition, second param is the return type. 
struct enable_if
{
  typedef T type; //if bool Cond is true, it returns the type.
};
现在,如果计算结果为
false
,则

template <class T>
struct enable_if<false, T>
{};

是替换失败,因为没有
类型
成员。由于替换失败不是错误,编译器只是从重载集中删除then函数。

false
的计算结果为
false
。我认为理解这一点所缺少的关键概念是。
false
的计算结果为
false
。我认为理解这一点所缺少的关键概念是。感谢您的详细回答。我特别困惑的是,被评价为布尔类型是错误的。@Yucel_K,这是可以理解的。请注意,
bool Cond
是一个非模板类型参数。这意味着你给它一个值而不是一个类型。我不会称之为错误,我会称之为替换failure@Yakk-阿达涅夫劳蒙特表示同意。我已经更新了答案谢谢你的详细回答。我特别困惑的是,被评价为布尔类型是错误的。@Yucel_K,这是可以理解的。请注意,
bool Cond
是一个非模板类型参数。这意味着你给它一个值而不是一个类型。我不会称之为错误,我会称之为替换failure@Yakk-阿达涅夫劳蒙特表示同意。我已经更新了答案
typename enable_if<!is_container<T>::value>::type
template <class T>
struct enable_if<false, T>
{};
typename enable_if<!is_container<T>::value>::type