Question

Selon Sergey Riazanov, son Incroyablement rapide C ++ Les délégués ne sont pas comparables:

  

Mes délégués ne peuvent pas être comparés. Les opérateurs de comparaison ne sont pas définis parce qu'un délégué ne contient pas de pointeur à la méthode. Pointeur vers une fonction de talon peut être différent dans les différentes unités de compilation.

Pour que l'on les lecteurs ont répondu:

  

« pointeur vers une fonction de talon peut être différent dans les différentes unités de compilation. »   Autant que je sache, ce n'est pas vrai. Les rédacteurs sont tenus de réutiliser des fonctions de modèle généré dans différentes unités de compilation (ce dont je suis sûr - mais je pense Borland fois violé cette règle). Je pense qu'il est parce que les classes (les pas dans les espaces de noms « sans nom ») utilisent une liaison externe et la façon dont vous utilisez les fonctions stub les empêchera toujours d'être inline (bien que cela ne devrait pas être un problème, soit en prenant l'adresse de la fonction forcera une version non-ligne pour générer et « lien externe » réalisée par l'éditeur de liens éliminer tous, mais une fonction du même nom (ils sont pris en charge et doivent être identiques par la norme)) ...

     

Si vous définissez une fonction de modèle une unité de traduction (fichier cpp), puis définir la même fonction différente dans une autre unité de traduction, seule une des deux versions sera le faire dans l'exécutable final. (Cela viole en fait la « Une définition la règle », mais fonctionne sur GCC, au moins ... pas sûr MSVC.) Le point est:. L'adresse [du talon] sera le même dans les différentes unités

     

Je vous invite à mettre à jour l'article (y compris la capacité de comparaison) si vous trouvez que cela est vrai pour MSVC -. Si MSVC est des normes attribution, à cet égard

Maintenant l'article est de quatre ans et l'auteur n'a pas répondu à aucune des observations au cours des trois dernières années, alors je me demande s'il n'y a aucun mérite au commentaire ci-dessus et si cette mise en œuvre spécifique peut en effet être changé pour soutenir des comparaisons.

La norme C d'interdire spécifiquement une telle utilisation, et si oui, sont l'un des compilateurs récents en fait conforme aux normes à cet égard?

Était-ce utile?

La solution

Le code est à la fois conforme à la norme, et de fin. Je ne vois pas un endroit où il viole ODR, et il est vrai que tous les instanciations d'un modèle de fonction avec les mêmes paramètres de modèle doivent avoir « la même adresse » (dans un sens que les pointeurs vers les fonctions doivent être égales) - comment Pour ce faire, n'a pas d'importance. ISO C ++ 03 14.5.5.1 [temp.over.link] décrit les règles plus en détail.

Ainsi, une comparaison pourrait bien y être définie d'une manière et portable conforme.

Autres conseils

Les soi-disant stub fonctions dans incroyablement rapide C ++ Les délégués sont fonctions statiques membres de modèle , qui sont essentiellement fonctions de modèle . De même pour l'amélioration de la variante Incroyablement rapide C ++ Les délégués, fixe.

La question se résume à ceci:

Est-ce instanciation d'une fonction de modèle (en utilisant les mêmes paramètres de modèle et la définition) dans différentes unités de traduction partagent la même adresse de pointeur de fonction?

Selon la norme C ++ (ISO C ++ 17, § 17.5.6.1), la réponse est oui .

Comme @Pavel a dit dans sa réponse, même appliquée pour la norme ISO C de 03 (ISO C ++ 03, § 14.5.5.1).

En d'autres termes, cette approche est conforme à la norme et les délégués sont en toute sécurité comparables -. Comparer leurs données égales si et seulement si elles sont liées à la même fonction et (dans le cas des fonctions membres) le même objet

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top