根据以下测试:
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::*重要?
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并且不带参数.
不同括号类型表达式的差异源于运算符优先级。
以下是获取类型的更详细、描述性规范的一种方法:
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::*()直接是一个函数类型,即返回数据成员指针的函数。
现在去喝咖啡……