C++ this怎么不是成员函数指针?

C++ How is this not member function pointer?

根据以下测试:

std::cout << std::is_member_function_pointer<int A::*()>::value << std::endl;

不是成员函数指针,而是普通函数,而this:

std::cout << std::is_member_function_pointer<int (A::*)()>::value << std::endl;

计算结果为真。我用 gcc 和 msvc 都试过了。这两个声明有什么区别?这些结果正确吗?为什么 A::* 周围的括号很重要?

不同括号类型表达式的区别,源于运算符的优先级。

这是获取类型的更详细的描述性规范的一种方法:

C:\my\forums\so0> echo struct A{}; using T = int A::*(); T o; int x = o; >1.cpp

C:\my\forums\so0> g++ -c 1.cpp
1.cpp:1:48: error: invalid conversion from 'int A::* (*)()' to 'int' [-fpermissive]
 struct A{}; using T = int A::*(); T o; int x = o;
                                                ^

C:\my\forums\so0> _

所以,我们看到 int A::*() 类型的变量具有 int A::* (*)().

类型

编辑:当它被标记为解决方案时,我无法删除它 post,所以记录一下:在上面的代码中,o 不是变量.相反,它是一个 函数声明 int A::*()直接是函数类型,即返回数据成员指针的函数。

现在去喝咖啡……

int A::*() 是函数的类型,returns Aint 类型的成员不带任何参数。所以它不是成员函数指针,更不是函数指针。

std::cout << std::is_member_function_pointer<int A::*()>::value << std::endl; // 0
std::cout << std::is_pointer<int A::*()>::value << std::endl;                 // 0
std::cout << std::is_function<int A::*()>::value << std::endl << std::endl;   // 1

括号改变了优先级,int (A::*)()A的成员函数指针的类型,returns int并且不带参数。