使用SFINAE结构定义的正确方法 P>出于教育的原因,我在玩C++的SfayAe行为,并以一种相当简单的形式构建了我自己的版本代码:STD::EnabLeII[I/COD]。但在使用略有不同的实现细节时,我注意到了不同的行为:

使用SFINAE结构定义的正确方法 P>出于教育的原因,我在玩C++的SfayAe行为,并以一种相当简单的形式构建了我自己的版本代码:STD::EnabLeII[I/COD]。但在使用略有不同的实现细节时,我注意到了不同的行为:,c++,sfinae,C++,Sfinae,实现为不完整类型: template <bool C, typename> struct enable_if; // incomplete type template <typename T> struct enable_if<true, T> { typedef T type; }; 模板结构启用\u if;//不完全类型 如果{typedef T type;},则模板结构启用_; 实现为空类型: template <bool C, typenam

实现为不完整类型:

template <bool C, typename> struct enable_if; // incomplete type
template <typename T> struct enable_if<true, T> { typedef T type; };
模板结构启用\u if;//不完全类型
如果{typedef T type;},则模板结构启用_;
实现为空类型:

template <bool C, typename> struct enable_if {}; // empty type
template <typename T> struct enable_if<true, T> { typedef T type; };
template struct enable_if{};//空类型
如果{typedef T type;},则模板结构启用_;
在g++(4.8.1和4.3.2)上,两个版本的编译和行为方式相同。MSVC 2008似乎只接受空类型的定义


这两个定义都是有效的C++,它们在行为上是否等价?

< P>标准,即: 类型扣减可能因以下原因而失败: [...] 试图在限定id的嵌套名称说明符中使用类型 当该类型不包含指定的成员或指定的 成员不是需要类型的类型[…]


这两种情况都是在同一句话中处理的,所以从我的理解来看,这真的不应该有什么区别——两种实现应该是等效的。

MSVC 2008永远不应该被用作参考。除非C++11改变了一些东西,否则我相信不存在的类型会产生一个不符合SFINAE条件的错误,而空类型则会。我不知道为什么我相信这一点,所以不要相信它…这是否适用于C++03和C++11?请注意,引用的段落只是标准中的一条注释。