PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Funktionsparameter - const vor Zeiger



BLUESCREEN3D
02-04-2006, 13:08
Ich habe eine Klasse, die etwa so aussieht:

struct c
{
operator int() const;
c operator+(const char * const ptr) const;
}
Wie man sieht ist der zweite Operator dazu da, die Klasse und einen String zu addieren:

c bla;
const char *blubb="test";
bla+blubb;
Nun dachte ich, dass das man das ganze auch so aufrufen könnte (man beachte das fehlende "const"):

c bla;
char *blubb="test";
bla+blubb;
Hier kommt der Compiler aber auf die Idee, dass anstelle von c::operrator+(const char * const) eigentlich auch die Klasse nach int gecastet werden könnte, um danach operator+(int, char *) aufzurufen...
Kurz: Der Compiler kann sich nicht entscheiden und beschwert sich :/

Ich dachte eigentlich, dass die const-Angaben bei Funktionsparametern nichts mit dem Datentyp zu tun haben, der übergeben werden soll, sondern nur angeben, dass die Variable in der Funktion nicht geändert wird.
Demnach müsste der Compiler c::operator+() aufrufen, da hier der Datentyp stimmt. Aber offensichtlich wird bei dem const, dass sich auf den Zeigerinhalt bezieht, doch ein Unterschied gemacht - im Gegensatz zu dem const, dass sich auf den Zeiger selbst bezieht.

Warum ist das so und gibt es eine Möglichkeit, das zum Laufen zu bringen, ohne c::operator+() nochmal ohne const zu überladen?

Mir ist aufgefallen, dass das ganze funktioniert, sobald man das erste const des Parameters von c::operator+() weglässt (auch, wenn man dann mit const char * addiert). Da ich aber den Zeigerinhalt nicht verändere sollte da ein const stehen...

locus vivendi
02-04-2006, 16:14
Bist du dir sicher, ob du die automatische Umwandlung in int wirklich brauchst? Würde nicht vielleicht auch einfach ein Member "as_int() const" ausreichen? Eine Klasse die einerseits eine Addition mit "char const*" zulässt, andererseits automatisch in int konvertiert, kommt mir doch etwas "verdächtig" vor. Ansonsten würde ich den +-Operator nicht als Member der Klasse implementieren, sondern außerhalb. So können nämlich prinzipiell alle Konvertierungen die auf der einen Seite des + möglich sind, auch auf der anderen zugelassen werden. Wenn du den Operator jedoch zu einem Member machst, gelten unterschiedliche Regeln für die beiden Seiten.