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-1c'est le même 0et donc peut être converti en double*. D'autres astuces, comme 0x0, 0Lou static_cast<int>(0), ne fonctionnent pas non plus. Même déclarer un const int Zero = 0et 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.
1-1un littéral entier ? Il s'agit d'une expression contenant deux littéraux entiers avec une valeur1et un-opérateur.