Genau das meinte ich. Der Rückgabetyp ist klar, es ist aber nicht möglich, herauszufinden, zu welchem Typ gecastet werden sollte. Also muss man schon vorher wissen, zu welchem Typ die Leute ein Objekt der Klasse am ehesten casten wollen könnten. Unpraktisch. :-/
...
Ich glaube ich muss es noch etwas detaillierter erklären.
Zum einen wird opCast nur bei expliziten Casts angewandt, d.h. bei Ausdrücken der Form cast(typ)variable.
Zum anderen finden bei solchen Ausdrücken bis zu zwei Casts nacheinander statt, nämlich der explizite Cast durch opCast (falls definiert), und anschließend der implizite Cast vom Typ des vorherigen Casts zum Typ, der im Ausdruck steht (falls nicht sowieso schon identisch und falls ein impliziter Cast überhaupt möglich ist). Dabei ist nicht etwa wichtig, dass opCast genau zu dem Typ castet, der im Ausdruck steht, sondern, dass es zu einem Typ castet, der - falls nötig - implizit zu dem Typ gecastet wird, der im Ausdruck steht.
Damit man es sich besser vorstellen kann, hier ein Musterbeispiel für opCast:
Wie man sieht, reicht es absolut aus, mit opCast zu einem festen Typ zu casten, der dann dennoch implizit zu jedem numerischen Basistyp gecastet werden kann.
Auch sollte man anmerken, dass ein Cast Sinn machen muss. Es wäre sowohl unsinnig explizit von Integer nach Circle innerhalb von opCast zu casten (obwohl es durchaus möglich ist), als auch implizit von int nach Circle, da die Typen untereinander logisch unverträglich sind.
Ansonsten: Wie bereits geschrieben, könnte opCast zukünftig überladbar werden.
Edit: @DFYX:
Da du Iteratoren angesprochen hast: In D sind Iteratoren, entgegen der C++ STL, eher unüblich. In der Regel werden Ranges verwendet. Folgendes wäre für dich also vielleicht von Interesse: