una - todas las funciones de c++
¿Se permite una implementación para ubicar dos definiciones de funciones idénticas en la misma dirección, o no? (1)
Esta pregunta ya tiene una respuesta aquí:
El estándar C ++ dice lo siguiente sobre el operador de igualdad ==
:
[C++11: 5.10/1]:
[..] Dos punteros del mismo tipo se comparan igual si y solo si ambos son nulos, ambos apuntan a la misma función, o ambos representan la misma dirección.
Mi interpretación inicial fue que las funciones no tienen semánticamente "direcciones" per se en este nivel, y que, por lo tanto, "o ambas representan la misma dirección" solo podían referirse a objetos, y no a funciones. De lo contrario, ¿por qué molestarse con la cláusula "apuntar a la misma función"?
Es decir, dos punteros de función del mismo tipo se comparan igual si y solo si ambos apuntan a la misma función, punto.
La consecuencia de esto sería que el comportamiento observado en esta pregunta (los punteros a dos funciones distintas pero idénticas tienen valores idénticos) sería un error de implementación, ya que se requeriría que los punteros a funciones distintas sean únicos.
Siento que esta es la intención de la cláusula, pero no puedo encontrar una manera de defender objetivamente el punto de vista de que así es como debe inferirse el significado del pasaje, o que realmente fue la intención del comité, y ahora es mi intención. La interpretación ha sido cuestionada :
[D] discuta conmigo cómo "[...] o ambos representan la misma dirección". no está satisfecho con el comportamiento de Visual C ++. (@jstine)
Así que mi pregunta es sobre la intención de este pasaje estándar.
Ya sea:
Estoy en el camino correcto: los punteros de función se deben comparar iguales si ambos apuntan a la misma función (se deben condenar las "direcciones"), o
Hay una redundancia en el pasaje: los punteros de función deben ser iguales si ambos apuntan a la misma función o si ambos representan la misma dirección; y, por extensión, una implementación puede hacer que existan dos funciones en la misma dirección.
Cual es
Bueno, mira la declaración lógicamente. Tienes tres cláusulas:
Ambos son nulos.
Ambos apuntan a la misma función.
Ambos tienen la misma dirección.
Estas cláusulas están unidas por un "o" lógico. Por lo tanto, si alguno de estos es verdadero, entonces los dos punteros pueden comparar iguales. Si un compilador así lo decide, es posible fallar el # 3 y aún así pasar el # 2. Lógico "o" significa que tales punteros se compararían igual.
Además, se debe tener en cuenta que los punteros de los miembros no tienen una "dirección" en el sentido tradicional. Tienen un valor, pero no es una dirección de memoria. Es por eso que no puedes lanzarlos para void*
y así sucesivamente.
El pasaje garantiza, dados los punteros de función t
y u
, si t == u
, que t(...);
causará el mismo comportamiento que u(...);
. Ese comportamiento hará referencia a NULL, llamará a la misma función o ejecutará el código en la misma dirección. Así, se tiene el mismo comportamiento.
Técnicamente, el problema de Mehrdad es que obtiene el mismo valor de dos nombres de función de miembro diferentes. Entonces se aplica # 3. No veo nada en el estándar que requiera que nombres de funciones de miembros diferentes devuelvan valores distintos al obtener funciones para ellos.