это сделало бы разбор и компиляцию
язык намного проще
Не понимаю как. Почему проще проанализировать и скомпилировать i < i > i
, если вам требуется , чтобы выдать диагностику, чем анализировать ее, если вам разрешено делать все, что вам чертовски хорошо, при условии, что выданный код не имеет побочных эффектов?
Компилятор Java запрещает недоступный код (в отличие от кода без эффекта), что является смешанным благословением для программиста и требует немного дополнительной работы от компилятора, чем тот, который фактически требуется для компилятора C ++ ( базовый анализ зависимостей блоков). Должен ли C ++ запрещать недоступный код? Возможно нет. Несмотря на то, что компиляторы C ++, безусловно, проводят достаточную оптимизацию для выявления недоступных базовых блоков, в некоторых случаях они могут делать слишком много. Должен ли if (foo) { ...}
быть недопустимым недостижимым блоком, если foo
является ложной константой времени компиляции? Что, если это не постоянная времени компиляции, но оптимизатор выяснил, как рассчитать значение, если оно допустимо, и компилятор должен понять, что причина его удаления зависит от реализации, чтобы не выдавать ошибку ? Больше особых случаев.
никто на самом деле не имеет тока
программы, которые имеют выражения без
побочные эффекты в них
Нагрузки. Например, если NDEBUG
имеет значение true, тогда assert
расширяется до пустого выражения без эффекта. Так что в компиляторе требуется еще больше особых случаев, чтобы разрешить некоторые бесполезные выражения, но не другие.
Я полагаю, что логическое обоснование состоит в том, что если бы он расширился до нуля, то (а) компиляторы в конечном итоге выдавали бы предупреждения для таких вещей, как if (foo) assert(bar);
, и (б) такой код был бы допустим при выпуске, но не при отладке что просто сбивает с толку:
assert(foo) // oops, forgot the semi-colon
foo.bar();
такие вещи, как самый неприятный анализ
Вот почему это называется "досадным". Это проблема обратной совместимости на самом деле. Если бы C ++ теперь изменил значение этих неприятных разборов, смысл существующего кода изменился бы. Как вы указали, не так много существующего кода, но комитет C ++ придерживается довольно сильной позиции в отношении обратной совместимости. Если вы хотите, чтобы язык менялся каждые пять минут, используйте Perl; -)
В любом случае, уже слишком поздно. Даже если бы у нас было отличное представление о том, что комитет C ++ 0x пропустил, почему какая-то функция должна быть удалена или несовместимо изменена, они не будут нарушать что-либо в FCD, если только FCD не имеет окончательной ошибки.
Обратите внимание, что для всех ваших предложений любой компилятор может выдать предупреждение для них (на самом деле, я не понимаю, в чем ваша проблема со вторым примером, но, конечно, для бесполезных выражений и для неприятных синтаксических разборов в телах функций). Если вы правы, что никто не делает это намеренно, предупреждения не причинят вреда. Если вы ошибаетесь, что никто не делает это преднамеренно, ваше заявление об их удалении неверно. Предупреждения в популярных компиляторах могут проложить путь к удалению функции, тем более что стандарт в основном создается авторами компиляторов. Тот факт, что мы не всегда получаем предупреждения об этих вещах, подсказывает мне, что в этом есть нечто большее, чем вы думаете.