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

问题描述

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

第 6.3.2.3 节,第 8 段:

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

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

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

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


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

强调:这不是问它是否可以工作,因为编译器同时支持 C 和 C++;这是在问C++抽象机是否官方支持同样的转换。

解决方法

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

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

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

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

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

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