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

时间:2016-04-01 06:37:54

标签: c++ typetraits

根据以下测试:

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::*周围的括号很重要?

2 个答案:

答案 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::*()直接是一个函数类型,即一个返回数据成员指针的函数。

现在去喝咖啡......