Rozważ następujący kod.
void f(double p) {}
void f(double* p) {}
int main()
{ f(1-1); return 0; }
MSVC 2017 tego nie kompiluje. Oznacza to, że istnieje niejednoznaczne przeciążone wywołanie, ponieważ 1-1jest takie samo, jak 0i dlatego może zostać przekształcone w double*. Inne sztuczki, takie jak 0x0, 0Llub static_cast<int>(0)też nie działają. Nawet zadeklarowanie const int Zero = 0i wywołanie f(Zero)powoduje ten sam błąd. Działa poprawnie, jeśli Zeronie jest const.
Wygląda na to, że ten sam problem dotyczy GCC 5 i niższych, ale nie GCC 6. Jestem ciekawy, czy jest to część standardu C ++, znany błąd MSVC, czy ustawienie w kompilatorze. Pobieżne Google nie przyniosło rezultatów.
1-1jest literał całkowity ? Jest to wyrażenie zawierające dwa liczby całkowite z wartością1i-operator.