Der obige Code wird aufgrund der Typkonvertierung erfolgreich kompiliert, obwohl ein char-Array übergeben wurde, für das ein bool
erwartet wird.
Ist es möglich, dass dieser Code nicht kompiliert wird? (C ++ 03 Lösung bevorzugt, da der Compiler an meinem Arbeitsplatz alt ist.)
Ich habe mir die folgenden verwandten Fragen zu StackOverflow angesehen, aber sie beheben dieses Problem nicht ganz. Implizite Konvertierung in C ++ verhindern , Warum wählt der Compiler bool over string für die implizite Typumwandlung von L" "?
Sie können eine Funktion deklarieren, die const char*
akzeptiert und keine Definition bereitstellt:
Dadurch wird es zur Verbindungszeit fehlschlagen. Du wirst immer noch alle anderen impliziten Konvertierungen übrig haben - von jedem Zeiger auf bool, ganzzahlig auf bool, schwebt auf bool ...
Eine andere Option:
%Vor% Auf diese Weise erhalten Sie eine Fehlermeldung darüber, dass es privat ist, wenn Sie es mit etwas anderem als bool
aufrufen.
Eine Option wäre, setBar
zu einer Vorlage zu machen und es nur mit bool
zu arbeiten:
Alternativ können Sie SFINAE mit std::enable_if
mit demselben Effekt verwenden, obwohl die Compilerwarnung angezeigt wird könnte weniger leicht zu lesen sein:
Es gibt ein allgemeines Idiom, das sowohl dieses Problem vermeidet als auch andere Vorteile bietet. Anstatt bool
zu verwenden, können Sie einen benutzerdefinierten Typ erstellen, der den darzustellenden Status deutlicher beschreibt.
Der Typ bool
repräsentiert nur einen generischen Wert von true
oder false
, während Sie diese Zustände in der tatsächlichen Verwendung überladen, um etwas Spezifischeres zu bedeuten. Hier ist ein Beispiel, das eine Aufzählung zum Definieren eines neuen Typs verwendet:
Dies ermöglicht weiterhin die implizite Konvertierung von jedem arithmetischen oder schwebenden Typ. Um dies zu vermeiden, kannst du C ++ 11s enum class
verwenden oder dein eigenes stark typisiertes Bool wie folgt rollen: