Pregunta

De acuerdo con Sergey Riazanov, su rápida Imposiblemente C ++ delegados no son comparables:

  

Mis delegados no se pueden comparar. Los operadores de comparación no se definen porque un delegado no contiene un puntero a método. Puntero a una función de código auxiliar puede ser diferente en diferentes unidades de compilación.

A lo que los lectores han respondido:

  

"puntero a una función de código auxiliar puede ser diferente en diferentes unidades de compilación."   Que yo sepa, esto no es cierto. Se requieren compiladores volver a utilizar las funciones de plantilla que se generan en diferentes unidades de compilación (esto estoy seguro de - pero creo que una vez Borland viola esta regla). Creo que es porque las clases (los que no están en los espacios de nombres sin nombre '') utilizan vinculación externa y el modo de usar las funciones del trozo siempre evitar que sean inline (aunque esto no debería ser un problema ya sea como tomar la dirección de la función obligará a una versión no en línea para ser generado y 'enlazado externo' realizado por el enlazador eliminará todas menos una función de nombre similar (que se supone y requiere que sean idénticos por el estándar)) ...

     

Si define una unidad de traducción función de plantilla (cpp) y luego definir la misma función de manera diferente en otra unidad de traducción, sólo una de las dos versiones se hacen en el ejecutable final. (En realidad, esto viola la "Regla Una definición", pero trabaja en GCC, al menos ... no está seguro acerca MSVC.) El punto es:. La dirección [del talón] será el mismo en las diferentes unidades

     

yo le pido a actualizar el artículo (incluyendo la capacidad de comparación) si usted encuentra que esto es cierto para MSVC -. MSVC si se otorgue normas, en este sentido

Ahora bien, el artículo es de cuatro años y el autor no ha respondido a ninguna de las observaciones durante los últimos tres años más o menos, por lo que estoy preguntando si hay algún mérito a la observación anterior y si esta implementación específica de hecho puede ser cambiado para soportar las comparaciones.

¿Tiene el estándar de C ++ prohíbe específicamente este uso y si es así, son cualquiera de los últimos compiladores realidad compatible con el estándar en ese sentido?

¿Fue útil?

Solución

El código es a la vez compatible con el estándar, y fino. No veo ningún lugar en el que viola ODR, y es verdad que todas las instancias de una plantilla de función con los mismos parámetros de plantilla deben tener "la misma dirección" (en el sentido de que los punteros a funciones deben ser todos iguales) - cómo esto se logra no es importante. ISO C ++ 03 14.5.5.1 [temp.over.link] describe las reglas en más detalle.

Por lo tanto, una comparación bien podría definirse de una manera no conformes y portátil.

Otros consejos

Los llamados talón Funciones en Imposiblemente Fast C ++ delegados son funciones estáticas miembro plantilla , que son básicamente funciones de plantilla . Lo mismo se aplica para la mejora de variante Imposiblemente Fast C ++ Delegados, fijo.

Así que la pregunta se reduce a esto:

Haz ejemplificaciones de una función de plantilla (usando los mismos parámetros de plantilla y definición) en diferentes unidades de traducción comparten la misma dirección de puntero de función?

De acuerdo con el estándar de C ++ (ISO C ++ 17, § 17.5.6.1), la respuesta es .

Como dijo @Pavel en su respuesta, el mismo aplica para el ISO C ++ estándar 03 (ISO C ++ 03, § 14.5.5.1).

En otras palabras este enfoque es estándar compatible y los delegados son de forma segura comparable -. Comparan sus datos iguales si y sólo si están unidos a la misma función y (en caso de funciones miembro) el mismo objeto

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top