C++ 所有非成员函数指针在C++;

C++ 所有非成员函数指针在C++;,c++,language-lawyer,function-pointers,sizeof,reinterpret-cast,C++,Language Lawyer,Function Pointers,Sizeof,Reinterpret Cast,在C编程语言中,我们可以保证函数指针可以合法地转换为不同类型的函数指针,并且不会丢失数据: 第6.3.2.3节第8段: 指向一种类型函数的指针可以转换为指向另一种类型函数的指针,然后再转换回来;结果应与原始指针进行比较 此规则间接保证sizeof一个函数指针必须与sizeof任何其他函数指针相同,因为不会发生数据丢失 但是,在C++标准中,如果要找到C++的17标准,如果要解决这个问题,我很难找到类似的段落。实际上,我很少提到与函数指针显式相关的任何转换,但既没有也没有提供任何类似的保证 我的问

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

第6.3.2.3节第8段:

指向一种类型函数的指针可以转换为指向另一种类型函数的指针,然后再转换回来;结果应与原始指针进行比较

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

但是,在C++标准中,如果要找到C++的17标准,如果要解决这个问题,我很难找到类似的段落。实际上,我很少提到与函数指针显式相关的任何转换,但既没有也没有提供任何类似的保证

我的问题是:<强> C++是否提供了C确保任何(非成员)函数指针可以保持任何其他(非成员)函数指针的值的保证?>/P>
我希望找到已经被问过的问题,但我能找到的最接近的问题是这个(这不能保证是与C++相同的答案),以及一些关于成员指针大小的无关问题

<强>强调:这不是因为编译器支持C和C++,所以它是否可以工作;这是询问C++抽象机是否正式支持同样的转换。

< P>是,引用:

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

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

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

[Ed]:回答的“是”部分指的是OP在帖子正文中的问题:“C++是否提供了C确保任何(非成员)函数指针可以保存任何其他(非成员)函数指针的值的相同保证?”


正如在的评论中指出的那样,这并不自动意味着“所有非成员函数指针在C++中都是相同大小的”(如问题标题所示),尽管这会强烈暗示它们是相同大小的。

[conc.ptr]更多的是关于可以隐式执行的标准转换。函数指针转换需要强制转换。我会在描述适当的一节中查找。我最近没有检查标准,但我记得在过去,您不能假设函数指针与数据指针的大小相同。不过,对于POSIX或Win32,这些规则定义得更多。但我知道这不是你所要求的。我不同意你所引用的规则保证
sizeof
在两个不同的函数指针上给出相同结果的解释。规则允许这样做,但这与要求不一样。有很多方法可以保证一个值在往返转换过程中幸存(即“a型到B型回到a型”和“B型到a型到B型”都会产生原始值),而不需要这两种类型具有相同的大小。如果一个大小较大,并且多余的位/字节未被使用,则与较大类型的转换只需要复制使用的位。但这实际上并不保证s的大小相等,不是吗?也许在死亡站9000上,一个
void(*)(
是4个字节,一个
int(*)(
是8个字节,但是额外的4个字节总是
0xdeadbeef
,因此它们可以在不丢失的情况下来回转换。@NateEldredge这在技术上是正确的,OP自己也认识到了这一点(“间接保证了…”)。然而,上面确实回答了文章正文中的问题,即“任何(非成员)函数指针是否可以持有任何其他(非成员)函数指针的值”。因此,“保证”可能有点太强了。也许“强烈建议”。@NateEldredge再次正确,希望编辑能更好地澄清这一点。@NateEldredge我确实记得一些旧的C实现,它们基于分段内存体系结构(物理上不同的内存(或存储)库)支持不同类型、不同大小的指针存储某些类型的对象,但不存储其他类型的对象)。指针表示的一部分标识了对象通常存储的内存区域——该信息的大小不同,不同类型之间指针的转换根本不会复制该信息——这会导致指针值在往返转换中幸存。