Seite 1 von 1
(gelöst) Sind no-op Konvertierungsoperatoren erlaubt?
Verfasst: 07.04.2013, 16:44
von Krishty
Hi,
Ist das hier standardkonform?
struct Foo {
operator Foo() const {
return *this;
}
};
Visual C++ akzeptiert es, und es spart mir 7 % Kompilierzeit.
Aber ich bin misstrauisch weil es eher wie etwas aussieht, was jemand dem Compiler zu verbieten vergessen hat …
Re: Sind no-op Konvertierungsoperatoren erlaubt?
Verfasst: 07.04.2013, 16:58
von Niki
Für mich sieht das wie ein ganz normaler Cast-Operator aus. Oder übersehe ich da eine Kleinigkeit? Wenn nicht, dann habe ich das schon auf zig Compilern benutzt. Schau mal hier unter "Cast-Operatoren", nur um sicher zu gehen das ich nichts übersehen habe:
http://de.wikibooks.org/wiki/C++-Progra ... Operatoren
Re: Sind no-op Konvertierungsoperatoren erlaubt?
Verfasst: 07.04.2013, 17:01
von Krishty
Er ist insofern nicht normal, als dass er exakt zum selben Typ castet wie vorher – er ist schlicht überflüssig.
Es könnte ja sein, dass im C++-Standard irgendwo ein Wortlaut steht, der Konvertierungsoperatoren nur für andere Typen erlaubt … damit ein blöder Compiler nicht in einer Endlosrekursion landet oder der Programmierer merkt, dass er Scheiße baut, oder so.
Re: Sind no-op Konvertierungsoperatoren erlaubt?
Verfasst: 07.04.2013, 17:13
von B.G.Michi
Siehe auch
hier. Du kannst ihn schon deklarieren aber es gibt eigentlich keine Möglichkeit ihn aufzurufen.
(Edit: im zitierten §12.3.2 steht nix von Referenzen, sollte also passen)
Re: Sind no-op Konvertierungsoperatoren erlaubt?
Verfasst: 07.04.2013, 17:19
von Krishty
Großartig; danke! :)
Re: (gelöst) Sind no-op Konvertierungsoperatoren erlaubt?
Verfasst: 08.04.2013, 14:29
von Jonathan
Wieso machst du sowas überhaupt? Und wie kann man damit Kompilierzeit sparen?
Re: (gelöst) Sind no-op Konvertierungsoperatoren erlaubt?
Verfasst: 08.04.2013, 17:52
von Krishty
Ich hatte bisher zwei Typen: ReadableRange<Foo> und ReadWritableRange<Foo>. Die beiden sind fast identisch; man handelt sich also entweder viel doppelten Quelltext ein oder eine komplexe Template-Hölle.
Eine große Hürde dabei, das durch eine einheitliche Klasse Range<Foo const> und Range<Foo> zu ersetzen, war, dass ich unbedingt eine Konvertierung von zweitem zu erstem benötige, möglichst implizit (so wie const Correctness nicht funktionieren würde, wenn man Foo nicht zu Foo const konvertieren könnte).
Verkacktes C++ hat keine eingebauten Datentypen für sowas. Aber dafür so gut wie völlig unbrauchbare C-Arrays. Bah.
Da ein no-op-Konvertierungsoperator – wie ich nun weiß – erlaubt ist, klatsche ich einfach einen Konvertierungsoperator zu Range<Foo const> rein und gut ist. Weil fast alle meine Algorithmen auf Ranges aufbauen, ist ein großer Teil meines Master-#includes entfallen, und das wirkt sich spürbar positiv auf die Kompilierzeit aus.
1>Build succeeded.
1>
1>Time Elapsed 00:00:00.83
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========
(Mittlerweile benötigt ein komplettes Neukompilieren der Engine plus Initialisierung bis ins Spiel weniger als eine Sekunde.)