C++这个为什么不是成员函数指针?

5
根据下面的测试:
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和msvc。这两个声明之间有什么区别?这些结果是否正确?为什么在A :: *周围加括号很重要?


运算符优先级。抱歉,我之前发表的评论有点讽刺。还没喝咖啡。:( 希望这能帮到你。请注意,C++语法只是隐含地定义了优先级,作为语法规则的结果。但总体上仍然存在有效的优先级。 - Cheers and hth. - Alf
即使有优先级,int A::*() 实际上是什么意思? - Alexander Bily
3
在我看来,这是一个返回成员指针的函数。 - user2357112
如果您使用括号(int A::*)(),结果是否相同?请使用typeid进行检查。 - Ulrich Eckhardt
当我将(int A::*)()传递给typeid时,我会收到一个错误 - 预期表达式。 - Alexander Bily
2个回答

5

int A::*()是一种函数类型,它返回类型为intA成员,不带参数。因此它既不是成员函数指针,也不是函数指针。请注意保留HTML标记。

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::*)() 是指返回 int 类型且不带参数的 A 类成员函数指针。


这个答案看起来是正确的(相对于我原来的答案,其中包含了一些无意义的东西 :( )。 - Cheers and hth. - Alf

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::*()直接是一个函数类型,即返回数据成员指针的函数。现在去喝咖啡了...

这是声明符,而不是运算符。 - M.M
@M.M 我提到运算符优先级是因为C语法就是这样构建的,声明模仿使用。我甚至没有考虑过它。 :) 严格来说你是对的,但那是一个不太实用的观点。 - Cheers and hth. - Alf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接