成员函数的decltype

Decltype of member functions

class A {
    int f(int x, int j) { return 2;}
    decltype(f)* p;
};

给我错误:

error: decltype cannot resolve address of overloaded function

我不明白为什么这个错误甚至是在谈论重载函数。同样,我认为也许我需要使用作用域运算符来访问函数:

class A {
    int f(int x, int j) { return 2;}
    decltype(A::f)* p;
};

这仍然给我一个错误,但描述更清楚:

error: invalid use of non-static member function 'int A::f(int, int)'

为什么不允许我使用 decltype 来查找成员函数的类型?或者,将成员函数设置为 static 可以消除两种情况下的错误。

你真正想要的是:

struct a {
    int f(int x, int j) { return 2;}
    decltype(&a::f) p;
};

Live demo

因为您所指的 f 是一个成员函数。推导的类型是:

int(a::*)(int, int)

如果没有 &,编译器会假设您正在尝试调用该函数而不向其提供参数。也许 Clang 的错误消息对此更清楚:

error: call to non-static member function without an object argument
    decltype(a::f) p;

如果您真的不想要指针类型,您可以稍后从 <type_traits>.

应用 std::remove_pointer_t