根据以下测试:
std::cout << std::is_member_function_pointer<int A::*()>::value << std::endl;
不是成员函数指针,而是常规函数,而这个:
std::cout << std::is_member_function_pointer<int (A::*)()>::value << std::endl;
评估为true。我用gcc和amp; MSVC。这两个声明之间有什么区别?这些结果是否正确?为什么A::*
周围的括号很重要?
答案 0 :(得分:5)
int A::*()
是函数类型,它返回类型为A
的{{1}}成员,不带参数。所以它不是成员函数指针,甚至不是函数指针。
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
是int (A::*)()
成员函数指针的类型,返回A
并且不带参数。
答案 1 :(得分:3)
不同的括号类型表达式的差异源于运算符优先级。
以下是获取类型的更详细,描述性规范的一种方法:
C:\my\forums\so\120> echo struct A{}; using T = int A::*(); T o; int x = o; >1.cpp C:\my\forums\so\120> 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\so\120> _
因此,我们发现 int A::*()
类型的变量的类型为int A::* (*)()
。
编辑:我在标记为解决方案时无法删除此帖子,因此对于记录:在上面的代码o
中不是变量。相反,它是函数声明。 int A::*()
直接是一个函数类型,即一个返回数据成员指针的函数。
现在去喝咖啡......