使用SFINAE结构定义的正确方法

时间:2013-07-17 14:16:48

标签: c++ sfinae

出于教育原因,我正在玩C ++的SFINAE行为并以相当简化的形式构建我自己的std::enable_if版本。我注意到在使用稍微不同的实现细节时会有不同的行为:

实施为不完整类型:

template <bool C, typename> struct enable_if; // incomplete type
template <typename T> struct enable_if<true, T> { typedef T type; };

实现为空类型:

template <bool C, typename> struct enable_if {}; // empty type
template <typename T> struct enable_if<true, T> { typedef T type; };

在g ++(4.8.1和4.3.2)上,两个版本的编译和行为方式相同。 MSVC 2008似乎只接受定义为空类型。

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

1 个答案:

答案 0 :(得分:1)

从标准,§14.8.2:

  

类型扣除可能会因以下原因而失败:       [...]       试图在qualified-id的嵌套名称说明符中使用类型       当该类型不包含指定的成员或指定的成员时       member不是需要类型的类型[...]

这两个案例都是用同一个句子处理的,所以根据我的理解,它确实不应该有所作为 - 两个实现都应该是等价的。