【发布时间】:2020-11-15 14:41:14
【问题描述】:
Stroustrup C++ 4th Ed Page 796 指出
"如果
Enable_if的条件评估为false,则整个函数 它所属的声明被完全忽略。”和“......我们 不要声明任何东西。”。
我还阅读了this suggested thread,其中 SFINAE 仅在模板参数的参数推导中的替换使构造不正确时才有效。
对于这个例子,我试图了解 SFINAE 如何省略 Enable_if<false, T> f0(int x) {}; 构造。
是因为缺少返回类型::type 导致模板在语言方面的结构不正确?
#include <type_traits>
using namespace std;
template<bool B, typename T>
using Enable_if = typename std::enable_if<B, T>::type;
struct X
{
template <class T>
Enable_if<false, T> f0(int x) {};
template <class T>
Enable_if<true, T> f0(int x) {};
};
int main(void)
{
X xx;
xx.f0<void>(0);
return 0;
}
我理解前面提到的构造线程中的情况:
template <typename enable_if<false>::type* = nullptr>
void f0() {}
这是因为模板参数格式不正确(没有将::type 分配给nullptr。)
【问题讨论】:
-
“是不是因为缺少返回类型 ::type 使得模板在语言方面的结构不正确?”
标签: c++ class c++11 templates sfinae