我如何比较C++中的函数指针?这是稳定的吗?
例如,像这样的代码是否有效:
if(pFnc == &myFnc){
//Do something
}
等于(equal to)和不等于(not equal to)运算符与关系运算符有相同的语义限制、转换和结果类型,除了它们的优先级较低且返回真值结果。【注意:当 a < b 和 c < d 具有相同的真值时,a < b == c < d 为真。】相同类型的对象或函数指针(经过指针转换后)可以进行相等比较。如果两个相同类型的指针都是空指针,都指向同一个函数,或者都表示同一地址(3.9.2),则它们相等。
强调部分为本人添加。
函数指针本质上与C++中的任何其他指针一样,都是一个内存地址。因此,在比较指针时,您始终在比较内存地址而不是值,这意味着只要两个指针是相同类型的,那么它们所指向的内容并不重要。
必须定义 pFnc
和 myFnc
。正确的比较应该是:
if(pFnc == myFnc)
{
//Do something
}
&myFnc
。 - Donotalo&
,声称去掉它会使它更正确,这有点牵强。我认为带上&
更正确,因为这是编译器最终要解释的内容...(我不想倡导其中任何一种方法,也不想讨论它,但我不太喜欢这个选项被称为正确的说法) - David Rodríguez - dribeas&myfunc
中标识符是 左值,它不会衰减。&myfunc
就是 函数的地址。你最后的评论听起来像是 我想生活在一个函数是指针并且行为就像它一样的谬论中,但是函数不是指针,就像数组不是指针一样。这实际上更加理由去键入 &
: 避免将函数与指针混淆! - David Rodríguez - dribeas
==
),那么是正确的。对于任何不等式,顺序是未定义的,但在应用程序的单个运行中保持稳定(假设它不是已加载的dll),可能跨多个相同二进制文件的执行(同样,没有涉及dll)。如果涉及dll,则只要不重新加载dll,顺序就会被维护...对于其他所有内容,您的所有赌注都将关闭(这也适用于==
:如果卸载并重新加载dll,则可能不测试相等性,因为它可能已经在不同的地址加载... - David Rodríguez - dribeas