Рассмотрим следующий код.
void f(double p) {}
void f(double* p) {}
int main()
{ f(1-1); return 0; }
MSVC 2017 не компилирует это. Он показывает, что существует неоднозначный перегруженный вызов, 1-1
такой же, как 0
и, следовательно, может быть преобразован в double*
. Другие трюки, вроде 0x0
, 0L
или static_cast<int>(0)
, тоже не работают. Даже объявление const int Zero = 0
и вызов f(Zero)
вызывает ту же ошибку. Это работает правильно только если Zero
нет const
.
Похоже, что та же проблема относится к GCC 5 и ниже, но не к GCC 6. Мне любопытно, является ли это частью стандарта C ++, известной ошибкой MSVC или установкой в компиляторе. Беглый гугл результатов не дал.
источник
1-1
1
-
-1
). Что, поскольку тип по умолчанию подписан , однако, очевидно, необходимо, и это также очевидно (и общепризнанно).1-1
. C ++ не имеет отрицательных целочисленных литералов.-1
является выражением, состоящим из1
целочисленного литерала (типа со-
знаком ) и унарного минусового оператора. Смотрите также раздел «Примечания» на cppreference.com .u
, ваш буквальным есть, по определению, подписано. Подписанные типы имеют отрицательные значения (около 50% возможных значений являются отрицательными). К сожалению, грамматика (по причине, о которой я не знаю) вводит в заблуждение таким образом, и хотя технически (согласно грамматике) -1 является положительным буквальным значением, отрицается всеми другими средствами, конечно, является отрицательным буквальный. Так же, как 3 + 4 является буквальным.0U
. Та же проблема. То, что я не пробовал, являетсяenum
ценностью. Возможно, названный человек изменил бы вещи. Я закончил тем, что написал длинное выражение сdecltype
иremove_reference
.