【发布时间】:2021-09-26 21:35:08
【问题描述】:
问题How does `void_t` work 显示了在类数据成员T::member 上使用void_t 的SFINAE 示例。但是,如果 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())你会得到member的返回值的decl类型,不是吗? -
decltype(&T::member)for 方法函数应该也可以,T::non_static_method_function无效。 -
decltype(T().member())也需要默认可构造T,decltype(std::declval<T>().member())更好。