【问题标题】:SFINAE using scope resolution operator in decltypeSFINAE 在 decltype 中使用范围解析运算符
【发布时间】: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(&amp;T::member) for 方法函数应该也可以,T::non_static_method_function 无效。
  • decltype(T().member())也需要默认可构造Tdecltype(std::declval&lt;T&gt;().member())更好。

标签: c++ templates sfinae


【解决方案1】:

decltype( T::member ) 不起作用,因为当member 引用非静态成员函数时,T::member 不是decltype 所期望的有效表达式。

您可以改为将其更改为 decltype( &amp;T::member )&amp;T::member 返回指向成员的指针,它适用于成员函数和数据成员,static 或非static

顺便说一句:Why is “using namespace std;” considered bad practice?

【讨论】:

    猜你喜欢
    • 2011-07-28
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2018-05-14
    相关资源
    最近更新 更多