MSV C считает 1-1
константой нулевого указателя. Это было правильно по стандарту для C ++ 03, где все выражения целочисленных констант со значением 0
были константами нулевого указателя, но это было изменено так, что только нулевые целочисленные литералы являются константами нулевого указателя для C ++ 11 с CWG выпуск 903 . Это серьезное изменение, как вы можете видеть в своем примере и которое также задокументировано в стандарте, см. [diff.cpp03.conv] стандарта C ++ 14 (черновик N4140).
MSV C применяет это изменение только в режиме соответствия. Таким образом, ваш код будет компилироваться с флагом /permissive-
, но я думаю, что изменение было реализовано только в MSV C 2019, см. здесь .
В случае G CC , G CC 5 по умолчанию работает в режиме C ++ 98, а G CC 6 и более поздние по умолчанию - в режиме C ++ 14, поэтому изменение поведения, похоже, зависит от версии G CC.
Если вы вызываете f
с константой нулевого указателя в качестве аргумента, то вызов является неоднозначным, поскольку константа нулевого указателя может быть преобразована в значение нулевого указателя любого типа указателя, и это преобразование имеет тот же ранг, что и преобразование от int
(или любого целочисленного типа) до double
.