从成员函数指针类型中删除类指针

Removing class pointer from member function pointer type

本文关键字:指针 删除 类型 函数 成员      更新时间:2023-10-16

我在 std::is_function 的 cppreference 示例中看到了这个代码片段,我不明白它是如何工作的。有人可以向我解释为什么 U 会像在 PM_traits 中那样被推论吗?

struct A {
  int fun() const&;
};
template<typename>
struct PM_traits {}; 
template<class T, class U>
struct PM_traits<U T::*> {
  using member_type = U;
};
int main() {
  using T = PM_traits<decltype(&A::fun)>::member_type; // T is int() const&
}

U T::*是一种类型,当我们有U T::* p时,p指向类T的成员,并且该成员的类型为U

fun 是一个类型 int () const & 的函数:一个不带参数并返回intconst &限定函数,它是类 A 的成员。因此,在演绎中,T被推导出为AU被推导出为A::fun的类型,即int () const &


它可能看起来有点令人困惑,因为如果明确拼写了&A::fun的类型,则必须将其写int (A::*)() const &。但是,在模板的情况下,类型 int () const & 被"隐藏"在名称 U 后面,因此指向成员的指针只是U A::* 。这类似于如何使用类型名称来简化普通函数指针的语法:

int foo(char, double) { return 42; }
using Fun = int (char, double);
Fun *p = &foo;
// instead of:
int (*q)(char, double) = &foo;

模板中也会发生同样的情况,只是使用 A::* 而不是 * .