Компилятор выбирает префикс ++, когда отсутствует постфикс - кто сказал? - PullRequest
11 голосов
/ 17 августа 2011

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

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

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

Ответы [ 3 ]

8 голосов
/ 17 августа 2011

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

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

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

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

1 голос
/ 17 августа 2011

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

0 голосов
/ 17 августа 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...