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