Considérez le code suivant.
void f(double p) {}
void f(double* p) {}
int main()
{ f(1-1); return 0; }
MSVC 2017 ne compile pas cela. Il suppose qu'il y a un appel surchargé ambigu, comme 1-1
c'est le même 0
et donc peut être converti en double*
. D'autres astuces, comme 0x0
, 0L
ou static_cast<int>(0)
, ne fonctionnent pas non plus. Même déclarer un const int Zero = 0
et appeler f(Zero)
produit la même erreur. Cela ne fonctionne correctement que siZero
n'est pas le cas const
.
Il semble que le même problème s'applique à GCC 5 et inférieur, mais pas à GCC 6. Je suis curieux de savoir si cela fait partie de la norme C ++, d'un bogue MSVC connu ou d'un paramètre du compilateur. Un rapide Google n'a pas donné de résultats.
la source
1-1
un littéral entier ? Il s'agit d'une expression contenant deux littéraux entiers avec une valeur1
et un-
opérateur.-1
). Ce qui, étant donné que le type par défaut est signé , est évidemment nécessaire, et il est manifestement possible (et universellement accepté) aussi.1-1
. C ++ n'a pas de littéraux entiers négatifs.-1
est une expression composée d'un1
littéral entier (de type signé) et d'un-
opérateur moins unaire. Voir également la section "Notes" sur cppreference.com .u
, votre littéral est, par définition, signé. Les types signés ont des valeurs négatives (environ 50% des valeurs possibles sont négatives). Il est malheureux que la grammaire (pour une raison que je ne connais pas) soit trompeuse de cette manière, et bien que techniquement (selon la grammaire) -1 soit un littéral positif, nié, par tous les autres moyens, c'est bien sûr un négatif littéral. Tout comme 3 + 4 est un littéral.0U
. Même problème. Ce que je n'ai pas essayé, c'est uneenum
valeur. Peut-être qu'une personne nommée aurait changé les choses. J'ai fini par écrire une longue expression avecdecltype
etremove_reference
.