Ответ 1
Компилятор С++ может оптимизировать по своему усмотрению при условии, что он не изменит "наблюдаемое поведение" соответствующей программы (& sect; 1.9p1, так называемое правило "как будто" ).
Например, если на данной платформе известно, что умножение на 1.0 является преобразованием идентичности без возможности ловушки, то умножение фактически не нужно выполнять. (Это может быть или не быть истинным для данной архитектуры, поскольку возможно, что перемножение значения NaN на 1.0 может ловушку. Однако компилятор также может заменить умножение на любую другую операцию, которая создавала бы одну и ту же ловушку при тех же обстоятельствах.)
В отсутствие ловушек и при условии, что умножение на 1.0 является преобразованием идентичности, весь элемент вашей функции f
может быть устранен, поскольку стандарт требует, чтобы набор значений float
являлся подмножеством множества значений double
(возможно, одного и того же набора). Следовательно, поплавок → double- > float round trip должен возвращаться к исходному значению или ловушке. (& sect; 3.9.1p8: "Набор значений типа float
является подмножеством набора значений типа double
". & sect; 4.8p1: "Значение значения типа с плавающей запятой может быть преобразовано в prvalue другого типа с плавающей точкой. Если исходное значение может быть точно представлено в типе назначения, результатом преобразования является точное представление." )
Итак, да, оптимизация может быть возможна. Но это не влияет на тип выражения ?:
в том случае, если тип является наблюдаемым (например, если выражение должно использоваться для вычитания шаблона или как операнд decltype
).