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-1
jest takie samo, jak 0
i dlatego może zostać przekształcone w double*
. Inne sztuczki, takie jak 0x0
, 0L
lub static_cast<int>(0)
też nie działają. Nawet zadeklarowanie const int Zero = 0
i wywołanie f(Zero)
powoduje ten sam błąd. Działa poprawnie, jeśli Zero
nie 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-1
jest literał całkowity ? Jest to wyrażenie zawierające dwa liczby całkowite z wartością1
i-
operator.