c++ - 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# 函数传递给第三方时,它所附加的对象会随之传递以允许稍后有效呼叫。您可能也可能无法在此处模拟类似的东西)。
推荐阅读
- java - 码头工人。使用 dockerfile 创建映像时出错
- javascript - 试图制作一个带有 ID 的对象
- python - Pandas Append 正在添加没有索引号的新行
- vb.net - vb.net 的初学者.. 处理登录表单
- javascript - react-redux 中间件中的“下一个”如何工作?
- python - 如何在 python 上使用 rtsp 和 GStreamer 流式传输 pc 网络摄像头
- sql - 更新时优化查询
- javascript - 用 forEach 方法替换 for 循环
- c# - 对用户进行身份验证并将他们引导到正确的菜单时出现 Switch 语句问题
- focus - 使用 Tab 键切换菜单项时显示对子菜单的关注