Ich schreibe ein Programm unter MS Visual C++ 6.0 (ja, ich weiß, es ist alt, nein, ich kann nichts tun, um zu aktualisieren). Ich sehe ein Verhalten, das ich wirklich komisch finde. Ich habe eine Klasse mit zwei Konstrukteuren wie folgt definiert:falsche Argument Umwandlung bevorzugt beim Aufruf der Funktion
class MyClass
{
public:
explicit MyClass(bool bAbsolute = true, bool bLocation = false) : m_bAbsolute(bAbsolute), m_bLocation(bLocation) { ; }
MyClass(const RWCString& strPath, bool bLocation = false);
private:
bool m_bAbsolute;
bool m_bLocation;
};
Wenn ich eine Instanz dieser Klasse mit dieser Syntax instanziiert: MyClass("blah")
, ruft sie den ersten Konstruktor. Wie Sie sehen können, fügte ich das Schlüsselwort explicit
hinzu, in der Hoffnung, dass es das nicht tun würde ... keine Würfel. Es scheint die Umwandlung von const char *
zu bool
gegenüber der Umwandlung zu RWCString
vorzuziehen, die einen Kopierkonstruktor hat, der eine const char *
nimmt. Warum macht es das? Ich würde annehmen, dass bei zwei möglichen Wahlmöglichkeiten, würde es sagen, es ist mehrdeutig. Was kann ich tun, um dies zu verhindern? Wenn es möglich ist, würde ich vermeiden wollen, dass das strPath
Argument explizit in eine RWCString
umgewandelt wird, da es sehr oft mit Literalen verwendet wird, und das ist eine Menge zusätzlicher Eingabe (plus ein wirklich einfacher Fehler zu machen).
Der C++ - Standard erlaubt es, jeden Zeiger in einen booleschen, IIRC umzuwandeln, weshalb const char * -> bool überhaupt erlaubt ist. Ich weiß einfach nicht, warum es das besser zu mögen scheint. Das Entfernen der Standard-Arg ist nicht ideal und würde wahrscheinlich keinen Unterschied machen, aber ich werde es versuchen. – rmeador