gpt4 book ai didi

c++ - SFINAE 在 decltype 中使用范围解析运算符

转载 作者:行者123 更新时间:2023-12-02 18:38:12 26 4
gpt4 key购买 nike

问题How does `void_t` work显示了 SFINAE 在类数据成员 T::member 上使用 void_t 的示例。但是,如果 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 不是 decltype 期望的有效表达式当 member 引用非静态成员函数时。

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

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

关于c++ - SFINAE 在 decltype 中使用范围解析运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68436804/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com