LINUX.ORG.RU

История изменений

Исправление aureliano15, (текущая версия) :

Можно, если текущий тип данных в левой части тоже. А для переопределения cin>> / cout<< уже требуется городить функции, причём в случае cin ещё и скорее всего дружественные.

В этом случае — да.

в C++ во время поиска по ключу в map не найдено значение, создаётся новая пара ключ-значение.

Но всегда можно воспользоваться методом find(). Хотя согласен с тем, что автоматическое добавление элемента при обращении к несуществующему ключу не очень логично.

Использование неинициализированных переменных, неправильные имена переменных, повторное определение типа данных, вызов функции без предшествующего прототипа, изменение сигнатуры функции при разыменовывании указателя на функцию, забытый return в функции, которая должна возвращать значение, директивы препроцессора в теле макрофункций.

С этим тоже в основном согласен. Но в крестах большинство этих ситуаций как раз являются ошибками. А в си этого не сделали, понятно, из-за большого объёма легаси. И это тоже логично. По крайней мере лучше, чем в питоне, где для разных скриптов приходится одновременно держать разные версии, постоянно путаясь в них, а когда старая версия перестанет поддерживаться — срочно всё переписывать.

например, GCC при неправильных фактических параметрах функций printf / scanf выдаёт предупреждение вместо молчаливого ухода в UB.

Имхо, такая реакция должна быть на любое ub.

Конечно же, упомянутый Вами алиасинг может «выстрелить в ногу» не в том месте, где произошло преобразование, поэтому на этапе компиляции это не отследить. Поэтому в данном случае использование неопределённого поведения оправдано.

Однако Visual C++ разрешает такое, не выстреливая в ногу. И gcc при задании опции -fno-strict-aliasing такое позволяет. Так что не всё так однозначно.

Статья даже отличная. Но я не понял, как из неё следует наблюдаемая мной ситуация с wxWidgets.

Непосредственно — никак. А опосредованно — через работу линкера, которая там подробно описывается.

Исходная версия aureliano15, :

Можно, если текущий тип данных в левой части тоже. А для переопределения cin>> / cout<< уже требуется городить функции, причём в случае cin ещё и скорее всего дружественные.

В этом случае — да.

в C++ во время поиска по ключу в map не найдено значение, создаётся новая пара ключ-значение.

Но всегда можно воспользоваться методом find(). Хотя согласен с тем, что автоматическое добавление элемента при обращении к несуществующему ключу не очень логично.

Использование неинициализированных переменных, неправильные имена переменных, повторное определение типа данных, вызов функции без предшествующего прототипа, изменение сигнатуры функции при разыменовывании указателя на функцию, забытый return в функции, которая должна возвращать значение, директивы препроцессора в теле макрофункций.

С этим тоже в основном согласен. Но в крестах большинство этих ситуаций как раз являются ошибками. А в си этого не сделали, понятно, из-за большого объёма легаси. И это тоже логично. По крайней мере лучше, чем в питоне, где для разных скриптов приходится одновременно держать разные версии, постоянно путаясь в них, а когда старая версия перестанет поддерживаться — срочно всё переписывать.

например, GCC при неправильных фактических параметрах функций printf / scanf выдаёт предупреждение вместо молчаливого ухода в UB.

Имхо, такая реакция должна быть на любое ub.

Конечно же, упомянутый Вами алиасинг может «выстрелить в ногу» не в том месте, где произошло преобразование, поэтому на этапе компиляции это не отследить. Поэтому в данном случае использование неопределённого поведения оправдано.

Однако Visual C++ разрешает такое, не выстреливая в ногу. И gcc при задании опции -fno-strict-aliasing такое позволяет. Так что не всё так однозначно.

Статья даже отличная. Но я не понял, как из неё следует наблюдаемая мной ситуация с wxWidgets.

Непосредственно — никак. А опосредованно через работу линкера, которая там подробно описывается.