【问题标题】:Why & operator is needed for taking address of member functions but not for global functions?为什么需要 & 运算符来获取成员函数的地址而不是全局函数?
【发布时间】:2015-11-19 08:08:21
【问题描述】:

以下代码运行良好

#include <iostream>
using namespace std;

void fun()
{
    cout<<"having some fun";
}

typedef void (*funptr)();
int main() {
    // your code goes here

    funptr p=fun;

    p();
    return 0;
}

这个不行。

#include <iostream>
using namespace std;

class myclass
{
    public:
    void fun()
    {
        cout<<endl<<"having fun inside myclass"<<endl;
    }
};

typedef void (myclass::*funptr)();

int main() {
    // your code goes here

    funptr p=myclass::fun; //THIS DOESN'T WORK. WHY?

    myclass m;

    (m.*p)();
    return 0;
}

为什么成员函数需要 & 运算符?

【问题讨论】:

  • 复制自link
  • 这与指向数据成员的指针的工作方式是一致的。函数名到函数指针的隐式转换就像数组名到指针(到第一个元素)的隐式转换。它是从 C 继承的一个特性。使指向成员的指针(无论是否为函数)使用相同类型的东西会弄乱允许派生类访问其基类成员以及访问命名空间成员的语法。

标签: c++ pointers function-pointers member-function-pointers


【解决方案1】:

函数类型T的左值可以隐式转换为T* ([conv.func]/4.3),但成员函数没有类似的规则。

我不确定这背后的原因是什么,所以我想我的答案是“标准是这样说的”。可能是因为成员函数指针不经常使用,所以没有必要为它们强制执行额外的实现细节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多