SFINAE在decltype中使用范围解析运算符
问题How do `void_t` work显示了 SFINAE 在类数据成员上使用 void_t 的示例T::member。但是,如果member是函数则不起作用。为什么会这样 ?如果我将代码从 更改decltype( T::member )为decltype( T().member() ).
#include <iostream>
using namespace std;
template< class ... > using void_t = void;
template< class , class = void >
struct has_member : std::false_type
{ };
template< class T >
struct has_member< T , void_t< decltype( T::member ) > > : std::true_type
{ };
struct A {
void member();
};
int main()
{
static_assert( has_member< A >::value , "A" ); // assertion fails
return 0;
}
回答
decltype( T::member )不起作用,因为T::member它不是引用非静态成员函数的decltypewhen 所期望的有效表达式member。
您可以将其更改为decltype( &T::member )。&T::member返回指向成员的指针,它适用于成员函数和数据成员,static或非static.
顺便说一句:为什么是“使用命名空间标准;” 被认为是不好的做法?