【问题标题】:What is the meaning of the note below in [expr.reinterpret.cast]/6?[expr.reinterpret.cast]/6 下面的注释是什么意思?
【发布时间】:2019-05-10 15:17:21
【问题描述】:

[expr.reinterpret.cast]/6:

函数指针可以显式转换为函数指针 不同类型的。 [ 注意:通过调用函数的效果 指向函数类型([dcl.fct])的指针,它与 函数定义中使用的类型未定义。 — 尾注 ] 除了将类型为“指向 T1 的指针”的纯右值转换为类型 “指向 T2 的指针”(其中 T1 和 T2 是函数类型)并返回到它的 原始类型产生原始指针值,这样的结果 未指定指针转换。 [ 注意:另见 [conv.ptr] 指针转换的更多细节。 — 尾注 ]

在我看来,这个注释是说下面的 sn-p(参见 demo)具有未定义的行为。它是否正确?或者除此之外还有什么别的吗?

#include<iostream>
void f() { std::cout << "function returning void\n"; }
int g() { std::cout << "function returning int\n"; return 1; }

int main(){
    void (*pf)() = f;
    reinterpret_cast<int(*)()>(pf)();
}

【问题讨论】:

  • 这是正确的。未定义的行为。
  • 而且可能非常糟糕,因为它期望堆栈上不存在的东西。完全堆栈损坏。

标签: c++ casting language-lawyer function-pointers reinterpret-cast


【解决方案1】:

注意点是函数指针可以转换,但结果可能不能用。但是,可以在使用前将结果 back 转换为原始类型。这个想法是将几种函数指针类型之一存储在一个变量中(不需要union)以及一个指示(以某种方式)实际函数类型的标记。

请注意,您根本无法将函数指针可移植地转换为 object 指针(例如void*)。但是,POSIX assumes you can do this,所以它经常工作。

【讨论】:

  • "请注意,您不能便携" 完全正确。在实践中,您可以(几乎总是)希望。
猜你喜欢
  • 2014-05-02
  • 1970-01-01
  • 2018-01-02
  • 2015-03-16
  • 2010-11-29
  • 1970-01-01
  • 2012-06-21
  • 2017-01-28
  • 2018-07-31
相关资源
最近更新 更多