出于教育原因,我正在玩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 ++,它们在行为上是否相同?
答案 0 :(得分:1)
从标准,§14.8.2:
类型扣除可能会因以下原因而失败: [...] 试图在qualified-id的嵌套名称说明符中使用类型 当该类型不包含指定的成员或指定的成员时 member不是需要类型的类型[...]
这两个案例都是用同一个句子处理的,所以根据我的理解,它确实不应该有所作为 - 两个实现都应该是等价的。