C++这不是成员函数指针吗?

Ale*_*ily 5 c++ type-traits

根据以下测试:

std::cout << std::is_member_function_pointer<int A::*()>::value << std::endl;
Run Code Online (Sandbox Code Playgroud)

不是成员函数指针,而是常规函数,而这个:

std::cout << std::is_member_function_pointer<int (A::*)()>::value << std::endl;
Run Code Online (Sandbox Code Playgroud)

评估为真.我用gcc和msvc试过了.这两个声明之间有什么区别?这些结果是否正确?为什么括号A::*重要?

son*_*yao 5

int A::*()是函数的类型,它返回A带有类型的成员int,不带参数.所以它不是成员函数指针,甚至不是函数指针.

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
Run Code Online (Sandbox Code Playgroud)

并且括号更改优先级,int (A::*)()是A成员函数指针的类型,它返回int并且不带参数.


Che*_*Alf 3

不同括号类型表达式的差异源于运算符优先级。

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

C:\my\forums\so\120> echo struct A{}; 使用 T = int A::*(); 到; int x = o; >1.cpp

C:\my\forums\so\120> g++ -c 1.cpp
1.cpp:1:48: 错误:从 'int A::* (*)()' 到 'int' 的转换无效 [-fpermissive]
 结构体A{};使用 T = int A::*(); 到; int x = o;
                                                ^

C:\我的\论坛\so\120> _

因此,我们看到类型变量的int A::*()类型为int A::* (*)()。

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

现在去喝咖啡……