std::enable_if<;出错&燃气轮机; 我试图在C++中使用一个基本的Sfaye模式,其中STL STD::Enable,如果,并且在第一个栏中失败: #include <type_traits> template< typename T > typename std::enable_if< true, bool >::type // compiles fine //std::enable_if< false, bool >::type // lots of errors myFunction( T val ) { // do stuff return true; } void main() { int i = 0; myFunction( i ); } #包括 模板 typename std::enable_if::type//编译良好 //std::enable_if::type//大量错误 myFunction(T val) { //做事 返回true; } void main() { int i=0; 我的功能(i); }

std::enable_if<;出错&燃气轮机; 我试图在C++中使用一个基本的Sfaye模式,其中STL STD::Enable,如果,并且在第一个栏中失败: #include <type_traits> template< typename T > typename std::enable_if< true, bool >::type // compiles fine //std::enable_if< false, bool >::type // lots of errors myFunction( T val ) { // do stuff return true; } void main() { int i = 0; myFunction( i ); } #包括 模板 typename std::enable_if::type//编译良好 //std::enable_if::type//大量错误 myFunction(T val) { //做事 返回true; } void main() { int i=0; 我的功能(i); },c++,c++11,visual-c++,visual-studio-2013,stl,C++,C++11,Visual C++,Visual Studio 2013,Stl,在第一种情况下,enable_if仅按预期工作。在第二种情况下,enable\u if我预计编译会失败,只会出现一个错误,沿着'myFunction':标识符未找到,但我得到多个错误,从'type'开始:不是'std::enable\u if'的成员,然后从那里传播更多错误 一方面,编译器确实给出了一个错误,但另一方面,我认为整个问题是替换失败不是一个错误?我是否遗漏了一个非常明显的要点?或者VC 2013是否存在SFINAE问题 当您使用std::enable\u if::type时,感谢您,

在第一种情况下,
enable_if
仅按预期工作。在第二种情况下,
enable\u if
我预计编译会失败,只会出现一个错误,沿着
'myFunction':标识符未找到
,但我得到多个错误,从
'type'开始:不是'std::enable\u if'
的成员,然后从那里传播更多错误

一方面,编译器确实给出了一个错误,但另一方面,我认为整个问题是替换失败不是一个错误?我是否遗漏了一个非常明显的要点?或者VC 2013是否存在SFINAE问题


当您使用
std::enable\u if::type

时,感谢您,字面上没有什么可以替代的。因此,代码总是错误的,编译器也会报告错误。SFINAE仅在存在“S”(替换)并最终导致“F”(失败)的情况下适用。

当您使用
std::enable\u if::type
时,字面上没有可替换的内容。因此,代码总是错误的,编译器也会报告错误。SimeAe仅适用于“S”(替换),最终为“F”(失败)。

< P>原因是VisualC++和GCC都实现了<代码> STD::Enable,如果使用部分专门化的<代码>真/ <代码>情况,而只是泛型的空结构,这当然是您得到的<代码> false >:

template<bool _Test,class _Ty = void>
struct enable_if
{   // type is undefined for assumed !_Test
};

template<class _Ty>
struct enable_if<true, _Ty>
{   // type is _Ty for _Test
  typedef _Ty type;
};
模板
结构启用\u如果
{//假定测试的类型未定义。\u
};
模板
结构启用\u如果
{//type是_测试的_Ty
类型定义类型;
};

他们甚至评论了类型> <代码> >对于<代码> false 实例。

原因是VisualC++和GCC都实现了<代码> STD::Enable,如果使用部分专门化的<代码> true实例,而只是泛型的空结构,当然,这就是你得到的
false

template<bool _Test,class _Ty = void>
struct enable_if
{   // type is undefined for assumed !_Test
};

template<class _Ty>
struct enable_if<true, _Ty>
{   // type is _Ty for _Test
  typedef _Ty type;
};
模板
结构启用\u如果
{//假定测试的类型未定义。\u
};
模板
结构启用\u如果
{//type是_测试的_Ty
类型定义类型;
};

他们甚至对
type
对于
false
案例是未定义的这一事实进行了评论。

enable\u如果
在第一个模板参数为
false
时强制使用未定义的返回类型。有关更多信息,我建议阅读:
enable\u if
在第一个模板参数为
false
时强制使用未定义的返回类型。有关更多信息,我建议阅读: