C ++成员函数指针定义?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (30)

考虑这个代码:

#include <iostream>
#include <functional>

struct B {
    template <class C, class M, class T>
    void call1(C (M::*member)(), T *instance) {
        std::function<void()> fp = std::bind(member, instance);
        fp();
    }

    template <class C, class M, class T>
    void call2(C (M::*member), T *instance) {
        std::function<void()> fp = std::bind(member, instance);
        fp();
    }

    void foo() {
        call1(&B::func, this); // works
        call2(&B::func, this); // works

        call1(&B::func2, this); // Error: no matching member function for call to 'call2'
        call2(&B::func2, this); // works
    }

    void func() {
        std::cout << "func\n";
    }

    void func2() const volatile {
        std::cout << "func2\n";
    }
};

int main() {
    B{}.foo();
}

看来,更高版本不接受具有额外cv限定符的函数。

指定一个像这样的函数成员指针C (M::*member)()和C (M::*member)的区别是什么?

提问于
用户回答回答于

让我们来看一个重载函数的例子,以及它如何得到不同的推导:

struct X 
    void bar() { }
    void bar(int ) { }
};

当我们这样做时:

f(&X::bar);

即使&X::bar是一个重载的名称,只有一个实际匹配C (M::*)()。有M == XC == void

但是,当我们这样做时:

g(&X::bar);

现在,有两个完美vaild扣除。C可能是void()void(int)。由于两者都是有效的,所以扣除是不明确的,而且不能编译 - 这个错误并没有使这个特别清楚。

现在回到你的例子:

call1(&B::func2, this); // Error: no matching member function for call to 'call2'
call2(&B::func2, this); // works

类型&B::func2void (B::*)() const volatile。由于call在不带参数的成员函数类型上推导并且不符合cv限定,所以类型推导失败。

扫码关注云+社区

领取腾讯云代金券