成员函数,无法推导出“auto”

Member function, unable to deduce ‘auto’

我想知道在 C++ 中是否可以从对象的成员函数中获取纯函数指针。

class AS
{
    int x;
public:
    AS(int xx)
    {
        x = xx;
    }

    void ww(void* p)
    {
        std::cerr << "AS::ww " << x << std::endl;
    }
};

void exp()
{
    void* pp = 0;
    AS aa(9);
    ((aa).*(&AS::ww))(pp);//compiles and work fine
    auto ff = ((aa).*(&AS::ww));//not compiling
}

我试过只保留调用部分:

    auto ff = ((aa).*(&AS::ww));

但这给了我 error: unable to deduce ‘auto’ from ‘aa.*&AS::ww’

那是为什么呢?它没有类型?

没有类型的人怎么称呼?

IIRC 一些实现支持在对象中保留此类闭包,但它不符合标准。 [expr.mptr.oper]/6:

If the result of .* or ->* is a function, then that result can be used only as the operand for the function call operator ().

但是,从 C++11 开始(您必须使用它,因为您正在使用 auto),请使用 std::bind 或 lambda:

auto ff = [&] (void* p) {return aa.ww(p);};

这个特殊问题通常是由与 C 回调接口引起的(`void* 参数是一个赠品)。解决方案是意识到在这些情况下, 控制了 void*。

因此:

class AS
{
    int x;
public:
    AS(int xx)
    {
        x = xx;
    }
    void ww()
    {
        std::cerr << "AS::ww " << this << std::endl;
    }
    static void ww(void* p)
    {
        static_cast<AS*>(p)->ww();
    }
};
setupCcallback(&AS::ww, static_cast<void*>(&aa));