2017-09-03 14 views
0

Ich habe versucht, einen Fehler in meinem Code zu finden, und fand heraus, dass ein Funktionsnamen Rückkehr implizit als wahr zu einem bool umgewandelt wurde:Warum gibt es eine implizite Konvertierung der Funktion zu bool?

bool isArabicNumeral(char arg) { /* Details not important*/ }; 
bool isValidVarNameFirstChar(char arg) { /* Details not important */ } 
bool isValidVarNameContinuationChar(char arg) 
{ 
    return isValidVarNameFirstChar || isArabicNumeral(arg) ? true : false; 
    // I forgot to write the brackets after isValidVarNameFirstChar 
    // so the function wasn't called. This always returns true. 
} 

So fand ich heraus, dass C++ Umwandlung, wo es in bool ermöglicht es die nützlich für eine solche Umwandlung stattfinden, so dass ich tun kann:

void afunction() {}; 

int main() 
{ 
    bool boolVariable = afunction; // This works 
    int intVariable = afunction; // This doesn't work 

    return 0; 
} 

Meine Frage ist, verstehe ich, dass es eine implizite Konvertierung von Funktion ist in bool, aber warum ist es immer wahr zurück. Und was wird eigentlich zu Bool konvertiert? Ist es der Funktionszeiger, so dass er in der Tat etwas wie 0xF7B3A1D0 zurückgibt, und das Umwandeln in "true", wenn alles, was nicht Null ist, wahr ist? Oder gibt es die Funktion Typname zurück? Oder etwas anderes? Es ist komisch, normalerweise, wenn ich versehentlich die Klammern nach einer Funktion verlasse, sagt mein Compiler normalerweise etwas wie "nicht standardmäßige Verwendung des Funktionsaufrufs".

Auch, wie ist das eine nützliche Umwandlung?

+0

Es geht nicht darum, nützlich zu sein. Es ist einfach eine Ableitung der allgemeinen Sprachregeln. – StoryTeller

+0

* "Wie ist das eine nützliche Umwandlung" * - Es ist nicht wirklich in diesem Fall, aber im allgemeinen Fall macht es Sinn. Es ist üblich (besonders im älteren Code), 'if (somePointer)' zu machen, um eine Nicht-Null-Prüfung durchzuführen. Dies funktioniert genauso gut für Funktionszeiger wie für Objektzeiger. Einen Sonderfall in die Sprache zu setzen, um diese Umwandlung zu verbieten, wenn eine benannte Funktion gegeben wird, ist wohl aufgebläht. Ganz einfach, es gibt keinen Grund, es zu verbieten. Es ist ähnlich wie 'if (1)'. – cdhowie

Antwort

1

Ist es der Funktionszeiger, so dass es in der Tat so etwas wie 0xF7B3A1D0 Rückkehr, und als alles auf true Umwandlung von Nicht-Null ist wahr?

Ja.

+1

Um genauer zu sein, ist es ein Nullheitstest, kein Vergleich zu * zero *. Nur weil eine Literal-Nullen verwendet werden können, um eine Null-Zeiger-Konstante zu erstellen, bedeutet das nicht, dass Null und Null gleich sind. –

0

Ja, Grund ist der Bool Check nur sieht, wenn es nicht falsch ist (aka 0), und wenn es nicht falsch ist, dann ist es wahr.

+1

"' false' aka null "ist inkorrekt, weil' false' eigentlich keine Nullzeigerkonstante ist –

+0

@Ben Voigt Also bekomme ich das gerade, es prüft ob es Null ist oder nicht, oder? Nicht sicher, was Sie mit Nullzeigerkonstante meinen. – Zebrafish

+1

@Zebrafish: Nein, es prüft, ob der Zeiger ein Nullzeiger ist. Sie können einen Nullzeiger als '0' schreiben, aber Nullzeiger und Null sind nicht identisch. Nur wörtlich "0" ist ein Nullzeiger, Arithmetik, die eine Null ergibt, ist nicht. –

Verwandte Themen