Betrachten Sie den folgenden Code.
void f(double p) {}
void f(double* p) {}
int main()
{ f(1-1); return 0; }
MSVC 2017 kompiliert das nicht. Es stellt sich heraus, dass es sich um einen mehrdeutigen überlasteten Anruf handelt, der mit 1-1dem identisch ist 0und daher in diesen konvertiert werden kann double*. Andere Tricks, wie 0x0, 0L, oder static_cast<int>(0), auch nicht arbeiten. Selbst das Deklarieren von a const int Zero = 0und das Aufrufen führen zu f(Zero)demselben Fehler. Es funktioniert nur richtig, wenn Zeronicht const.
Es sieht so aus, als ob das gleiche Problem für GCC 5 und niedriger gilt, jedoch nicht für GCC 6. Ich bin gespannt, ob dies ein Teil des C ++ - Standards, ein bekannter MSVC-Fehler oder eine Einstellung im Compiler ist. Ein flüchtiger Google lieferte keine Ergebnisse.
1-1ein ganzzahliges Literal ? Es ist ein Ausdruck, der zwei ganzzahlige Literale mit Wert1und einem-Operator enthält.