【问题标题】:C++ How is this not member function pointer?C++这怎么不是成员函数指针?
【发布时间】:2016-04-01 06:37:53
【问题描述】:

根据以下测试:

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++ 语法仅隐式定义优先级。但总体上存在有效的优先级。
  • 即使有优先级,int A::*() 究竟是什么意思?
  • 在我看来就像一个返回成员指针的函数。
  • 如果你使用像(int A::*)()这样的括号,你会得到同样的结果吗?是一样的吗(检查typeid)?
  • 当我将 (int A::*)() 传递给 typeid 时,我得到一个错误 - 需要一个表达式

标签: c++ typetraits


【解决方案1】:

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

括号改变优先级,int (A::*)()A 的成员函数指针的类型,它返回int 并且不带任何参数。

【讨论】:

  • 这个答案似乎是正确的(与我最初的答案相反,其中包括一些废话:()。
【解决方案2】:

不同括号类型表达式的差异,源于运算符优先级。

这是获得更详细、更详细的类型说明的一种方法:

C:\my\forums\so\120> echo struct A{};使用 T = int A::*();到;诠释 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::*();到;诠释 x = o; ^ C:\我的\论坛\so\120> _

所以,我们看到int A::*() 类型的变量具有int A::* (*)() 类型。

编辑:当它被标记为解决方案时,我无法删除该帖子,因此记录在案:在上面的代码中o 不是变量。相反,它是一个函数声明int A::*()直接是函数类型,即返回数据成员指针的函数。

现在去喝咖啡了……

【讨论】:

  • 这是声明符,不是操作符
  • @M.M 我提到了运算符优先级,因为这就是 C 语法的构建方式,声明模仿了用法。我什至没有考虑。 :) 形式上你是对的,但这是一个不太实用的观点。
猜你喜欢
  • 2018-09-12
  • 1970-01-01
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
  • 2013-05-30
  • 2011-09-09
相关资源
最近更新 更多