25

C++ 标准对等式运算符有以下说明==

[C++11: 5.10/1]: [..]相同类型的两个指针比较相等当且仅当它们都是空的,都指向同一个函数,或者都表示相同的地址。

我最初的解释是,在这个级别上,函数本身在语义上没有“地址”,因此“或两者都表示相同的地址”只能指代对象,而不是函数。否则为什么要使用“指向相同的功能”条款呢?

也就是说,两个相同类型的函数指针比较相等当且仅当它们都指向同一个函数,句点。

这样做的结果是,在这个问题中看到的行为(指向两个不同但相同的函数的指针具有相同的值)将是一个实现错误,因为指向不同函数的指针需要是唯一的。

觉得这是该条款的意图,但我无法客观地捍卫这样一种观点,即这就是应该如何推断段落的含义,或者这确实是委员会的意图,现在我的解释受到质疑

[D] 与我讨论如何“[...] 或两者都代表同一个地址。” 对 Visual C++ 的行为不满意。(@jstine)

所以我的问题是关于这个标准段落的意图。

任何一个:

  • 我在正确的轨道上:函数指针必须比较相等,如果它们都指向同一个函数(“地址”该死),或者

  • 这段话有一个冗余:函数指针必须比较相等,当且仅当它们都指向同一个函数或都表示同一个地址;并且,通过扩展,允许实现使两个函数存在于同一地址。

它是哪一个?

4

1 回答 1

5

好吧,从逻辑上看这个语句。你有三个子句:

  1. 两者都是空的。

  2. 两者都指向相同的功能。

  3. 两者的地址相同。

这些子句由逻辑“或”连接。因此,如果其中任何一项为真,则允许两个指针比较相等。如果编译器如此决定,则可能会失败 #3 但仍会通过 #2。逻辑“或”意味着这样的指针将比较相等。

另外,需要注意的是,成员指针没有传统意义上的“地址”。它们确实有一个值,但它不是内存地址。这就是为什么你不允许将它们投射到void*等等。

该段落保证,给定函数指针tu如果t == u,那t(...);将导致与 相同的行为u(...);。该行为将引用 NULL、调用相同的函数或在相同地址执行代码。因此,具有相同的行为。

从技术上讲,Mehrdad 的问题在于他从两个不同的成员函数名称中获得了相同的值。所以#3 适用。我在标准中看不到任何要求不同成员函数名称在为它们获取函数时返回不同值的内容。

于 2013-01-07T02:29:37.320 回答