Компилятор использует префикc++, когда постфикс отсутствует - кто говорит?

Когда вы определяете префиксный оператор ++ для своего пользовательского типа и не предоставляете постфиксную версию, компилятор (по крайней мере, в Visual С++) будет использовать версию PREFIX, когда ваш код вызывает отсутствующую версию POSTFIX.

По крайней мере, это даст вам предупреждение. Но, мой вопрос: почему он просто не дает вам ошибку для функции undefined?

Я видел это из первых рук и видел, как это упоминалось в другом посте и в другом месте, но я не могу найти это в реальном стандарте на С++. Мои второй и третий вопросы... Это где-то в стандарте? Является ли это специфической для Microsoft ситуацией?

Ответ 1

На самом деле, в этом случае MSVC ведет себя гораздо разумнее, чем GCC.
Это расширение компилятора MSVC, и стандарт С++ явно допускает такое поведение.

Стандарт С++:
Раздел 1.4/8:
Соответствующая реализация может иметь расширения (включая дополнительные функции библиотеки) при условии, что они не изменят поведение какой-либо хорошо сформированной программы. Реализации необходимы для диагностики программ, которые используют такие расширения, которые плохо сформированы в соответствии с этим Международным стандартом. Однако, сделав это, они могут компилировать и выполнять такие программы.

В этом случае MSVC надлежащим образом диагностирует проблему, когда постфикс недоступен, и он конкретно определяет предупреждения,
Предупреждение о компиляторе (уровень 1) C4620
Предупреждение о компиляторе (уровень 1) C4621

Кроме того, он предоставляет вам возможность отключать определенные расширения MSVC, используя /Za. В целом, я бы сказал, что это один из примеров, когда MSVC ведет себя лучше, чем GCC.

Ответ 2

Это должно быть специальное расширение Microsoft. Потому что, по крайней мере, g++ строго относится к префиксным и постфиксным операторам. Вот демонстрационная ссылка .

Ответ 3

С целыми числами ++ я отличается от я ++. Для примера я = 5, y = ++ я - y будет 6; y = я ++ - y будет 5. Другие типы должны функционировать одинаково. Поэтому поведение отличается от постфикса и префикса.

Это дело Microsoft, и, на мой взгляд, реализация компиляторов неверна.