C++中所有非成员函数指针的大小是否相同

在 C 编程语言中,我们保证函数指针可以合法地转换为不同类型的函数指针并返回而不会丢失数据:

第 6.3.2.3 节,第 8 段:

指向一种类型函数的指针可以转换为指向另一种类型函数的指针,然后再返回;结果应与原始指针相等。

此规则间接保证了sizeof一个函数指针必须与sizeof任何其他函数指针相同,因为不会发生数据丢失。

但是,我很难在 C++ 标准中找到任何类似的段落(目前正在阅读 C++17 标准,如果这很重要)。实际上,我几乎没有提到任何与函数指针相关的转换,但既没有conv.ptr也没有basic.compound真正提供任何类似的保证。

我的问题是:C++ 是否提供与 C 相同的保证,即任何(非成员)函数指针都可以保存任何其他(非成员)函数指针的值?


我希望找到已经问过的问题,但我能找到的最接近的是C 的类似问题(不能保证与 C++ 的答案相同),以及一堆关于成员指针大小的无关问题。

要强调的是:这不是在问是否可以正常工作,因为编译器同时支持C和C ++; 这是在询问 C++ 抽象机是否正式支持这种相同的转换。

回答

是的,引自expr.reinterpret.cast/6:

函数指针可以显式转换为不同类型的函数指针。

【注5:通过与函数定义中使用的类型不同的函数类型([dcl.fct])的指针调用函数的效果是未定义的([expr.call])。— 尾注]

除了 将“指向 T1 的指针”类型的纯右值转换为“指向 T2 的指针”类型 (其中 T1 和 T2 是函数类型) 并返回其原始类型会产生原始指针值之外, 这种指针转换的结果是未指定的.

[编辑]答案的“”部分指的是 OP 的问题,如帖子正文中的措辞:“ C++ 是否提供与 C 相同的保证,即任何(非成员)函数指针都可以保存任何其他函数的值(非成员)函数指针? ”。

正如@NateEldredge的评论中指出的那样,这并不自动暗示“所有非成员函数指针在 C++ 中都具有相同的大小”(如问题的标题所示),尽管它强烈建议他们这样做.

  • This doesn't actually guarantee that the `sizeof`s are equal, though, does it? Maybe on the DeathStation 9000 a `void (*)()` is 4 bytes, and an `int (*)()` is 8 bytes, but the extra 4 bytes are always `0xdeadbeef` and so they can be converted back and forth without loss.

以上是C++中所有非成员函数指针的大小是否相同的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>