C++ 使用';在比较中,他被换成了另一种类型?

C++ 使用';在比较中,他被换成了另一种类型?,c++,casting,function-pointers,C++,Casting,Function Pointers,无法直接比较不同类型的函数指针: #include <iomanip> #include <iostream> int foo() { return 0; } void bar(int) {} int main() { // Doesn't compile, the comparison is not allowed std::cout << std::boolalpha << (&foo == &bar) &l

无法直接比较不同类型的函数指针:

#include <iomanip>
#include <iostream>

int foo() { return 0; }
void bar(int) {}

int main()
{
    // Doesn't compile, the comparison is not allowed
    std::cout << std::boolalpha << (&foo == &bar) << std::endl;
    return 0;
}
#包括
#包括
int foo(){return 0;}
空条(int){}
int main()
{
//未编译,不允许进行比较
std::coutFrom

函数指针可以显式转换为不同类型的函数指针。[…]除了将类型为“指针指向
T1
”的PR值转换为类型为“指针指向
T2
”(其中
T1
T2
是函数类型)返回到其原始类型将产生原始指针值,这种指针转换的结果是未指定的

未指定浇铸函数指针的比较是否相等

指针可以显式转换为任何足以容纳它的整数类型。映射函数由实现定义

因此,转换为
std::intptr\t
或其他合适的类型是很自然的选择,前提是实现不使用一些古怪的转换

如果指针表示大于整数类型,则从指针到整数的转换丢弃最高有效位;如果指针表示小于整数类型,则丢弃符号扩展1,否则位不变

我敢打赌,在大多数情况下,你可能会发现这一点


[1]GCC的未来版本可能会进行零扩展,或者使用目标定义的ptr_扩展模式。不要依赖符号扩展。

转换为
std::intptr_t
怎么样?@PasserBy这是一个有趣的想法。
std::intptr_t
可以存储指针,但我不清楚它是否可以存储函数指针。函数指针不需要d与常规指针具有相同的大小。指针可以显式转换为任何足够大的整数类型来容纳它。映射函数是实现定义的。如果大小足够大,似乎可以(大多数情况下)使用。除了将“pointer to
T1
”类型的PR值转换为类型之外“指向
T2
的指针”(其中
T1
T2
是函数类型)返回到其原始类型将产生原始指针值,这样的指针转换的结果是未指定的。似乎转换为不同的函数指针类型并使用它们是不可靠的。除了依赖于实现定义的行为之外,您难道不能使用正确定义的运算符==?存储类型擦除的包装器吗在问题的评论中,我不相信
std::intptr\u t
可以存储一个函数指针,它的大小不需要与常规指针相同。我也不确定结果的整数表示形式是否对于函数指针来说是唯一的,而不是其他t的函数指针的整数表示形式ypes。我非常感谢您的时间和所做的研究。我会看看是否能找到任何东西来解决这些新问题。@FrançoisAndrieux这是我从gcc文档中得到的最好的东西。AFAIK不允许对函数指针进行其他转换,所以这可能就是您得到的。在这种情况下,我可能只相信impleme别把我搞砸了。你知道,没有一个正常的实现会有两个不同的函数具有相同的地址,而且既然gcc说位是不变的,我就说这是唯一性的保证。如果OP想保持更像C的意义,那么函数地址的转换就足够了。然后进行比较,类型转换它们(取决于架构)到
uint32\u t
uint64\u t
就足够了,可以这样比较它们的地址吗?
#include <iomanip>
#include <iostream>

int foo() { return 0; }
void bar(int) {}

int main()
{
    auto cast_ptr = reinterpret_cast<decltype(&bar)>(&foo);

    // Printed "false" when I tried it, but is this guaranteed?
    std::cout << std::boolalpha << (cast_ptr == &bar) << std::endl;
}
#include <iomanip>
#include <iostream>

int foo() { return 0; }
void bar(int) {}

int main()
{
    using cast_type = void(*)();
    auto cast_foo = reinterpret_cast<cast_type>(&foo);
    auto cast_bar = reinterpret_cast<cast_type>(&bar);

    // Also printed "false" when I tried it, but is this guaranteed?
    std::cout << std::boolalpha << (cast_foo == cast_bar) << std::endl;
}