Frage

Laut Sergey Ryazanov, seiner Unglaublich schnelle C ++ Delegierte sind nicht vergleichbar:

Meine Delegierten können nicht verglichen werden. Vergleichsoperatoren sind nicht definiert, da ein Delegierter keinen Zeiger auf die Methode enthält. Der Zeiger auf eine Stubfunktion kann in verschiedenen Kompilierungseinheiten unterschiedlich sein.

Worauf die Leser geantwortet haben:

"Zeiger auf eine Stubfunktion kann in verschiedenen Kompilierungseinheiten unterschiedlich sein." Afaik, das ist nicht wahr. Compiler müssen Vorlagenfunktionen wiederverwenden, die in verschiedenen Kompilierungseinheiten generiert wurden (dies bin mir sicher - aber ich denke, Borland hat diese Regel einmal verletzt). Ich denke, es liegt daran Wird eine nicht-inline-Version erzeugen, und die vom Linker ausgeführte "externe Verknüpfung" entscheidet alle bis auf eine ähnlich benannte Funktion (sie werden angenommen und müssen vom Standard identisch sein)) ...

Wenn Sie eine Template -Funktion One Translation Unit (CPP -Datei) definieren und die gleiche Funktion in einer anderen Übersetzungseinheit unterschiedlich definieren, wird es nur eine der beiden Versionen in die endgültige ausführbare Datei ermöglicht. (Dies verstößt tatsächlich gegen die "One Definitionsregel", funktioniert jedoch zumindest nicht auf GCC über MSVC.) Der Punkt lautet: Die Adresse [des Stubs] wird in verschiedenen Einheiten gleich sein.

Ich würde Sie dringend bitten, den Artikel (einschließlich Vergleichsfunktionen) zu aktualisieren, wenn Sie dies für MSVC als wahr sind - wenn MSVC diesbezüglich Standards -Konferenz ist.

Jetzt ist der Artikel vier Jahre alt und der Autor hat in den letzten drei Jahren auf keinen der Kommentare geantwortet. Daher frage ich Unterstützungsvergleiche.

Verbietet der C ++-Standard ausdrücklich eine solche Verwendung, und wenn ja, sind in dieser Hinsicht einer der jüngsten Compiler tatsächlich standardmäßig konform?

War es hilfreich?

Lösung

Der Code ist sowohl Standard -konform als auch in Ordnung. Ich sehe keinen Ort, an dem er gegen ODR verstößt, und es ist wahr, dass alle Instanziationen einer Funktionsvorlage mit denselben Vorlagenparametern "dieselbe Adresse" haben sollten (in dem Sinne, dass Zeiger auf Funktionen alle gleich sein sollten) - wie wie Dies ist nicht wichtig. ISO C ++ 03 14.5.5.1 [temp.over.link] beschreibt die Regeln ausführlicher.

Daher könnte dort ein Vergleich konform und tragbar definiert werden.

Andere Tipps

Die sogenannte Stummel Funktionen in Unglaublich schnelle C ++ Delegierte sind statische Vorlagenelementfunktionen, die im Grunde genommen sind Vorlagenfunktionen. Gleiches gilt für die verbesserte Variante Unglaublich schnelle C ++ Delegierte, behoben.

Die Frage läuft also darauf hinaus:

Teilen Instanziationen einer Vorlagenfunktion (mit denselben Vorlagenparametern und Definition) in verschiedenen Übersetzungseinheiten dieselbe Funktion Zeigeradresse?

Gemäß dem C ++ - Standard (ISO C ++ 17, § 17.5.6.1) lautet die Antwort Jawohl.

Wie @Pavel in seiner Antwort sagte, galt dasselbe für den ISO C ++ 03 -Standard (ISO C ++ 03, § 14.5.5.1).

Mit anderen Worten, dieser Ansatz ist Standard -konform und die Delegierten sind sicher vergleichbar - ihre Daten vergleichen gleich, wenn sie nur dann an dieselbe Funktion gebunden sind und (im Fall von Mitgliedsfunktionen) dasselbe Objekt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top