C++中所有非成员函数指针的大小都一样吗

Are all non-member function pointers the same size in C++

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

第 6.3.2.3 节第 8 段:

A pointer to a function of one type may be converted to a pointer to a function of another type and back again; the result shall compare equal to the original pointer.

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

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

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


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

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

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

A function pointer can be explicitly converted to a function pointer of a different type.

[Note 5: The effect of calling a function through a pointer to a function type ([dcl.fct]) that is not the same as the type used in the definition of the function is undefined ([expr.call]). — end note]

Except that converting a prvalue of type “pointer to T1” to the type “pointer to T2” (where T1 and T2 are function types) and back to its original type yields the original pointer value, the result of such a pointer conversion is unspecified.

[ EDIT ] 答案的“yes”部分指的是 body 中 OP 的问题post:“C++ 是否提供与 C 相同的保证,即任何 (non-member) 函数指针都可以保存任何其他 (non-member) 函数指针的值? ".

正如 @NateEldredge 的评论中所指出的,这并不自动意味着“所有 non-member 函数指针在 C++ 中 [=] 的大小相同 ”(正如问题的标题所示),尽管强烈建议他们这样做。