是否允许实现在同一地址站点两个相同的函数定义?

Lig*_*ica 25 c++ language-lawyer

C++标准说明了关于等于运算符的以下内容==:

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

我的初步解释是函数本身在语义上没有"地址"本身,因此"或两者代表相同的地址"只能用于引用对象,而不是函数.否则为什么要打扰"指向同一个功能"条款呢?

也就是说,当且仅当两者都指向相同的函数period时,相同类型的两个函数指针才相等.

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

觉得,这是该条款的意图,但我不能找到一种方法来客观地捍卫的观点,这是何等的通道的意思实际上应该推断,或者它真的是委员会的意图,现在我的解释已经成为问题:

[D]跟我说"[...]或两者代表同一个地址." 不满足于Visual C++的行为.(@jstine)

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

或者:

  • 我在正确的轨道上:函数指针必须比较相等,如果它们都指向相同的函数("地址"被诅咒),或者

  • 通道中有一个冗余:函数指针必须比较相等,如果它们都指向同一个函数或两者都代表相同的地址; 并且,通过扩展,允许实现使两个函数存在于同一地址.

这是什么?

Nic*_*las 5

好吧,从逻辑上看一下这句话.你有三个条款:

  1. 两者都是空的.

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

  3. 两者都有相同的地址.

这些条款由逻辑"或"连接.因此,如果其中任何一个为真,则允许两个指针进行比较相等.如果编译器如此决定,则可能会失败#3但仍然会传递#2.逻辑"或"意味着这样的指针会比较相等.

此外,应该注意的是,成员指针在传统意义上没有"地址".它们确实有值,但它不是内存地址.这就是为什么你不允许你把它们void*等等.

该通道保障,给定函数指针tu,如果t == u,这t(...);将导致相同的行为u(...);.该行为将引用NULL,调用相同的函数或在同一地址执行代码.因此,具有相同的行为.

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

  • #3发生但#2没有发生很容易就是专业化优化的结果,其中相同的逻辑函数被编译为两个不同的实现,这些实现根据调用站点上的不同静态保证被调用,在这种情况下编译器可以记录额外的尽管具有不同的地址(例如,指针可能包含多于一个地址,或者可能使用一些额外的表),某处的数据以确保函数指针仍然比较相等.我不知道是否有任何主流编译器在实践中这样做,但没有理由禁止它. (2认同)