C++ this怎么不是成员函数指针?
C++ How is this not member function pointer?
根据以下测试:
std::cout << std::is_member_function_pointer<int A::*()>::value << std::endl;
不是成员函数指针,而是普通函数,而this:
std::cout << std::is_member_function_pointer<int (A::*)()>::value << std::endl;
计算结果为真。我用 gcc 和 msvc 都试过了。这两个声明有什么区别?这些结果正确吗?为什么 A::*
周围的括号很重要?
不同括号类型表达式的区别,源于运算符的优先级。
这是获取类型的更详细的描述性规范的一种方法:
C:\my\forums\so0> echo struct A{}; using T = int A::*(); T o; int x = o; >1.cpp
C:\my\forums\so0> 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\so0> _
所以,我们看到 int A::*()
类型的变量具有 int A::* (*)()
.
类型
编辑:当它被标记为解决方案时,我无法删除它 post,所以记录一下:在上面的代码中,o
不是变量.相反,它是一个 函数声明 。 int A::*()
直接是函数类型,即返回数据成员指针的函数。
现在去喝咖啡……
int A::*()
是函数的类型,returns 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
括号改变了优先级,int (A::*)()
是A
的成员函数指针的类型,returns int
并且不带参数。
根据以下测试:
std::cout << std::is_member_function_pointer<int A::*()>::value << std::endl;
不是成员函数指针,而是普通函数,而this:
std::cout << std::is_member_function_pointer<int (A::*)()>::value << std::endl;
计算结果为真。我用 gcc 和 msvc 都试过了。这两个声明有什么区别?这些结果正确吗?为什么 A::*
周围的括号很重要?
不同括号类型表达式的区别,源于运算符的优先级。
这是获取类型的更详细的描述性规范的一种方法:
C:\my\forums\so0> echo struct A{}; using T = int A::*(); T o; int x = o; >1.cpp C:\my\forums\so0> 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\so0> _
所以,我们看到 int A::*()
类型的变量具有 int A::* (*)()
.
编辑:当它被标记为解决方案时,我无法删除它 post,所以记录一下:在上面的代码中,o
不是变量.相反,它是一个 函数声明 。 int A::*()
直接是函数类型,即返回数据成员指针的函数。
现在去喝咖啡……
int A::*()
是函数的类型,returns 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
括号改变了优先级,int (A::*)()
是A
的成员函数指针的类型,returns int
并且不带参数。