So verhindern Sie die implizite Konvertierung von char-Array in bool

8
%Vor%

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" "?

    
Masked Man 27.08.2013, 11:18
quelle

3 Antworten

9

Sie können eine Funktion deklarieren, die const char* akzeptiert und keine Definition bereitstellt:

%Vor%

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.

    
jrok 27.08.2013, 11:22
quelle
7

Eine Option wäre, setBar zu einer Vorlage zu machen und es nur mit bool zu arbeiten:

%Vor%

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:

%Vor%     
juanchopanza 27.08.2013 11:29
quelle
5

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:

%Vor%

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:

%Vor%     
willj 27.08.2013 14:04
quelle

Tags und Links