微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Namespace::* 和传统的 * 有什么区别吗?

如何解决Namespace::* 和传统的 * 有什么区别吗?

class C {
    public:
    int a;
    int f();
};

int C::f() { return 0; }




int main() {


    C c {1};

    int(C::*pmf)() = &C::f;
    // int(*pmf)() = &C::f; -> error can not convert int(*C::f)() to int(*f)().


}

ram 中的 Namespace::* 和 * 有什么区别还是只是由编译器检查?是语法糖吗?

解决方法

当然:https://isocpp.org/wiki/faq/pointers-to-members

非静态成员函数有一个对应于 this 指针的隐藏参数。 this 指针指向对象的实例数据。

这些函数在物理上是不可互换的,因为成员有一个额外的参数 - 您从中调用它的对象。你看不到它,但编译器把它放在那里。当该对象丢失时,编译器显然会抱怨。这不像 C#,其中每个函数都是一个成员函数,有些只是碰巧是静态的(有趣的事实:当将 C# 函数传递给第三方时,它所附加的对象会随之传递以允许稍后有效调用。您可能会也可能无法在此处模拟类似的东西)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。