取消成员函数的类型

Decltype of member functions

本文关键字:类型 函数 成员 取消      更新时间:2023-10-16
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;
};

现场演示

因为你引用的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