Указатель типа, который указывает на объект (т.е. не пустота *, а не указатель на функцию) не могут быть сохранены на указатель на любой другой вид объекта без броска, за исключением нескольких случаев где типы идентичны , за исключением квалификаторов. Соответствующие компиляторы должны выдать диагностику , если это правило нарушено.
Кроме того, стандарт позволяет составителям интерпретировать код, который бросает указателей в бессмысленных модах, если код Помощников некоторых ограничениями , которые, как написано сделать такие броски по существу бесполезны, для номинального целью содействия оптимизации. Когда правила были написаны, большинство компиляторов , вероятно, выполнили бы примерно половину оптимизаций, которые могли бы быть разрешены по правилам, но все равно обработали бы стрелки указателей , так как это обойдется примерно в 5% от теоретически возможных оптимизаций. Однако сегодня для разработчиков компилятора более модно искать все случаи, когда оптимизация может быть разрешена стандартом без учета того, имеют ли они смысл.
Составителей как НКУ имеет возможность -fno-строгое сглаживание, который блокирует этот разновидности оптимизации, как в тех случаях, когда он будет предлагать большие преимущества и небольшого риска, а также в тех случаях, когда это будет почти наверняка сломать и вряд ли предложит какую-либо реальную выгоду. Было бы полезно, если бы у была возможность заблокировать только последнее, но я не знаю об этом. Таким образом, моя рекомендация заключается в том, что если вы не хотите программировать в очень ограниченном подмножестве языка Денниса Ричи, я бы предложил настроить таргетинг на диалоги -fno-strict-aliasing .
По типу функции вы имеете в виду тип возвращаемой переменной? – TheLogicGuy
Нет никаких функций! Я расширил свой ответ, так что теперь, наверное, это яснее. – lukeg
Но считать 'foo' функцией не переменную. Как это возможно сейчас? – TheLogicGuy