C++ 关于C++; 这些线的意思相同吗?两者都可以工作,没有任何警告信息 在这种情况下,我为什么要用符号?没有它,就不工作 为什么即使函数指针的类型完全匹配,也必须为类中的函数指定名称空间 为什么在这种情况下我不能指定名称空间

C++ 关于C++; 这些线的意思相同吗?两者都可以工作,没有任何警告信息 在这种情况下,我为什么要用符号?没有它,就不工作 为什么即使函数指针的类型完全匹配,也必须为类中的函数指定名称空间 为什么在这种情况下我不能指定名称空间,c++,function,pointers,namespaces,ampersand,C++,Function,Pointers,Namespaces,Ampersand,您的第一个问题,标准的法律术语: 仅当使用显式&且其操作数是未封闭的限定id时,才会形成指向成员的指针 括号内。[注:即表达式&(限定id),其中限定id包含在 括号不构成“指向成员的指针”类型的表达式。限定id也不构成,因为 不存在从非静态成员函数的限定id到类型“指针指向”的隐式转换 成员函数”,因为从函数类型的左值到类型“指向函数的指针”(4.3)。也不是 &非限定id指向成员的指针,即使在非限定id的类的范围内也是如此。-结束注释] 虽然一开始看起来不一致,但我确实喜欢这样一个事实,即它

您的第一个问题,标准的法律术语:

仅当使用显式&且其操作数是未封闭的限定id时,才会形成指向成员的指针 括号内。[注:即表达式&(限定id),其中限定id包含在 括号不构成“指向成员的指针”类型的表达式。限定id也不构成,因为 不存在从非静态成员函数的限定id到类型“指针指向”的隐式转换 成员函数”,因为从函数类型的左值到类型“指向函数的指针”(4.3)。也不是 &非限定id指向成员的指针,即使在非限定id的类的范围内也是如此。-结束注释]

虽然一开始看起来不一致,但我确实喜欢这样一个事实,即它使指向成员的指针(无论是函数还是非函数)的语义等价。在处理模板和decltype时,这当然有好处

对于第二个问题,使用CMyClass限定指针变量的作用域,因为您的函数不是简单的“()->int”函数:memberFunc1()隐式传递了一个通常称为“this”的CMyClass*参数

如果您真的什么也不传递,那么您将丢失该方法正确工作所需的信息(可能会崩溃)。如果您习惯于其他语言中的“委托”,请记住,如果方法不是静态/全局的,那么这些语言可以选择性地存储指向“this”对象的“Target”指针

至于第三个,它是一个独立的函数,因此它确实是()->int,但您试图限定指向命名空间的指针的范围,而实际上您并没有在命名空间块中声明变量


虽然名称空间肯定会改变符号的搜索方式,但它根本不会影响函数的约定调用。

您的第一个问题,标准的法律术语:

仅当使用显式&且其操作数是未封闭的限定id时,才会形成指向成员的指针 括号内。[注:即表达式&(限定id),其中限定id包含在 括号不构成“指向成员的指针”类型的表达式。限定id也不构成,因为 不存在从非静态成员函数的限定id到类型“指针指向”的隐式转换 成员函数”,因为从函数类型的左值到类型“指向函数的指针”(4.3)。也不是 &非限定id指向成员的指针,即使在非限定id的类的范围内也是如此。-结束注释]

虽然一开始看起来不一致,但我确实喜欢这样一个事实,即它使指向成员的指针(无论是函数还是非函数)的语义等价。在处理模板和decltype时,这当然有好处

对于第二个问题,使用CMyClass限定指针变量的作用域,因为您的函数不是简单的“()->int”函数:memberFunc1()隐式传递了一个通常称为“this”的CMyClass*参数

如果您真的什么也不传递,那么您将丢失该方法正确工作所需的信息(可能会崩溃)。如果您习惯于其他语言中的“委托”,请记住,如果方法不是静态/全局的,那么这些语言可以选择性地存储指向“this”对象的“Target”指针

至于第三个,它是一个独立的函数,因此它确实是()->int,但您试图限定指向命名空间的指针的范围,而实际上您并没有在命名空间块中声明变量

虽然名称空间肯定会改变符号的搜索方式,但它根本不会影响函数的约定调用。

1)关于Q1,请看下面的代码,因为func1是函数的正确值,所以带或不带“&”都不会改变实际的函数地址。 请看以下代码:

#include <stdio.h>

void foo(){
   printf("foo called\n");
}


int main(){
   printf("%p\n", foo);
   printf("%p\n", &foo);
   void (*FUNC) ();
   FUNC = foo;
   FUNC();
   printf("address %p\n", FUNC);
   printf("address %p\n", &FUNC);
   return 0;
}
第二季度和第三季度) 指向成员函数的指针不是指针 你可以在这里查阅

1)关于Q1,请看下面的代码,因为func1是函数的正确值,所以带或不带“&”都不会更改实际的函数地址。 请看以下代码:

#include <stdio.h>

void foo(){
   printf("foo called\n");
}


int main(){
   printf("%p\n", foo);
   printf("%p\n", &foo);
   void (*FUNC) ();
   FUNC = foo;
   FUNC();
   printf("address %p\n", FUNC);
   printf("address %p\n", &FUNC);
   return 0;
}
第二季度和第三季度) 指向成员函数的指针不是指针 你可以在这里查阅

建议读数:Thanx,P0W。该线程非常有用。建议阅读:Thanx,P0W。这条线真的很有用。非常感谢萨德罗格!非常感谢萨尔德隆格!谢谢一百万崔恒,它帮了我很多。谢谢一百万崔恒,它帮了我很多
int (*pMemberFunc)() = CMyClass::memberFunc1;       // Compiler error
int (*pMemberFunc)() = &CMyClass::memberFunc1;      // Compiler error
namespace myNamespace {
    int func1() {}
}

int (myNamespace::*pFunc)() = myNamespace::func1;       // Compiler error
int (myNamespace::*pFunc)() = &myNamespace::func1;      // Compiler error

int (*pFunc)() = &myNamespace::func1;       // Works!
#include <stdio.h>

void foo(){
   printf("foo called\n");
}


int main(){
   printf("%p\n", foo);
   printf("%p\n", &foo);
   void (*FUNC) ();
   FUNC = foo;
   FUNC();
   printf("address %p\n", FUNC);
   printf("address %p\n", &FUNC);
   return 0;
}
0x101406eb0
0x101406eb0
foo called
address 0x101406eb0
address 0x7fff5e7f9a80