Lig*_*ica 25 c++ language-lawyer
C++标准说明了关于等于运算符的以下内容==:
[C++11: 5.10/1]:[..]相同类型的两个指针比较相等,当且仅当它们都为空时,都指向相同的函数,或者两者都表示相同的地址.
我的初步解释是函数本身在语义上没有"地址"本身,因此"或两者代表相同的地址"只能用于引用对象,而不是函数.否则为什么要打扰"指向同一个功能"条款呢?
也就是说,当且仅当两者都指向相同的函数period时,相同类型的两个函数指针才相等.
这样做的结果是在这个问题中看到的行为(指向两个不同但相同的函数的指针具有相同的值)将是一个实现错误,因为指向不同函数的指针将是唯一的.
我觉得,这是该条款的意图,但我不能找到一种方法来客观地捍卫的观点,这是何等的通道的意思实际上应该推断,或者它真的是委员会的意图,现在我的解释已经成为问题:
[D]跟我说"[...]或两者代表同一个地址." 不满足于Visual C++的行为.(@jstine)
所以我的问题是关于这个标准段落的意图.
或者:
我在正确的轨道上:函数指针必须比较相等,如果它们都指向相同的函数("地址"被诅咒),或者
通道中有一个冗余:函数指针必须比较相等,如果它们都指向同一个函数或两者都代表相同的地址; 并且,通过扩展,允许实现使两个函数存在于同一地址.
这是什么?
好吧,从逻辑上看一下这句话.你有三个条款:
两者都是空的.
两者都指向相同的功能.
两者都有相同的地址.
这些条款由逻辑"或"连接.因此,如果其中任何一个为真,则允许两个指针进行比较相等.如果编译器如此决定,则可能会失败#3但仍然会传递#2.逻辑"或"意味着这样的指针会比较相等.
此外,应该注意的是,成员指针在传统意义上没有"地址".它们确实有值,但它不是内存地址.这就是为什么你不允许你把它们void*等等.
该通道保障,给定函数指针t和u,如果t == u,这t(...);将导致相同的行为u(...);.该行为将引用NULL,调用相同的函数或在同一地址执行代码.因此,具有相同的行为.
从技术上讲,Mehrdad的问题是他从两个不同的成员函数名称获得相同的值.所以#3适用.我没有在标准中看到任何要求不同成员函数名称在获取函数时返回不同值的内容.