C++ SFINAE 和 !std::is_member_function_pointer::value 的有效性

C++ SFINAE and the validity of !std::is_member_function_pointer::value

我正在尝试使用 C++ 中的 SFINAE 创建一个通用的容器插入器模板函数,我 认为以下结构

// replace T::nonexistent_member with whatever member function you want to test
// note the ! negation operator
std::enable_if< ! std::is_member_function_pointer<decltype(&T::nonexistent_member)>::value>

根据定义从不有效。

当成员函数不存在时,SFINAE规则会说"T doesn't have a member function called nonexistent_member so don't even bother considering the template as a match."

当成员函数确实存在时,is_member_function_pointer 计算结果为真,使 enable_if 为假并从考虑中删除模板。

我说的对吗?此类型表达式在定义上是否不正确,其中,当它求值时,只会求值为 false。

如果T::nonexistent_member是成员函数,当然,enable_if会在后面分流

但是,它也可以是数据成员,或者静态成员函数,或者静态数据成员。在那些情况下,&T::nonexistent_member 是有效的,但 不是 成员函数指针,因此 enable_if 通过。