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-1
dem identisch ist 0
und 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 = 0
und das Aufrufen führen zu f(Zero)
demselben Fehler. Es funktioniert nur richtig, wenn Zero
nicht 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.
quelle
1-1
ein ganzzahliges Literal ? Es ist ein Ausdruck, der zwei ganzzahlige Literale mit Wert1
und einem-
Operator enthält.-1
). Dies ist jedoch offensichtlich notwendig , da der Standardtyp signiert ist, und es ist nachweislich auch möglich (und allgemein anerkannt).1-1
. C ++ hat keine negativen Ganzzahlliterale.-1
ist ein Ausdruck, der aus einem1
ganzzahligen Literal (vom Typ mit Vorzeichen) und einem-
unären Minusoperator besteht. Siehe auch den Abschnitt "Notizen" auf cppreference.com .u
, Ihre wörtliches sind per Definition unterzeichnet. Vorzeichenbehaftete Typen haben negative Werte (ca. 50% der möglichen Werte sind negativ). Es ist bedauerlich, dass die Grammatik (aus einem Grund, den ich nicht kennen würde) auf diese Weise irreführend ist, und obwohl technisch (laut Grammatik) -1 ein positives Literal ist, das negiert wird, ist es auf alle anderen Arten natürlich ein negatives wörtlich. Ähnlich wie 3 + 4 ist ein Literal.0U
. Gleicher Fehler. Was ich nicht ausprobiert habe, ist einenum
Wert. Vielleicht hätte ein Name die Dinge geändert. Am Ende schrieb ich einen langen Ausdruck mitdecltype
undremove_reference
.