C++ コンパイラは、適合するプログラムの「観察可能な動作」を変更しない限り、適切と思われるように最適化できます (§1.9p1、いわゆる「as if」ルール)。
たとえば、特定のプラットフォームで、1.0 による乗算がトラップの可能性のない恒等変換であることがわかっている場合、乗算を実際に実行する必要はありません。(NaN 値を 1.0 で乗算するとトラップされる可能性があるため、これは特定のアーキテクチャに当てはまる場合とそうでない場合があります。ただし、コンパイラは、同じ状況で同じトラップを生成する他の操作で乗算を置き換えることもできます。 .)
トラップがなく、1.0 による乗算が恒等変換であると仮定すると、関数の本体全体をf
削除できます。標準では、値のセットがfloat
値のセットのサブセットdouble
(おそらく同じセット) であることを要求しているためです。したがって、float->double->float の往復は、元の値またはトラップに戻る必要があります。(§3.9.1p8: 「型の値のセットは、型float
の値のセットのサブセットですdouble
」。§4.8p1: 「浮動小数点型の prvalue は、別の浮動小数点型の prvalue に変換できます。ソース値が宛先タイプで正確に表現できる場合、変換の結果はその正確な表現になります。")
したがって、はい、最適化が可能な場合があります。?:
ただし、型が観測可能である場合 (たとえば、式がテンプレート演繹または のオペランドとして使用される場合) は、式の型には影響しませんdecltype
。