嘗試使用浮點值作為預設參數實例化泛型類別模板時,編譯器可能會問題錯誤。雖然整數值如預期運行,但浮點數卻不然。
根據 C 11 標準 (14.3.2/1),非類型模板參數-type 模板參數必須遵守特定規則。一項限制是它們不能是浮點數值。相反,它們必須是整型或枚舉類型、模板參數類型的轉換常數表達式或其他特定構造。
此限制可能源自於浮點計算的不精確性。準確地表示浮點數值並不總是可行的,這會導致潛在的不準確,從而導致意外的行為。考慮以下範例:
func<1/3.f>(); func<2/6.f>();
雖然打算呼叫相同函數兩次,但由於潛在的捨入誤差,1/3 和 2/6 的浮點表示形式不能保證相同。這可能會導致意外的函數呼叫。
如果目標是以某種方式將浮點值表示為模板參數,一種選擇是利用 C 11 常數表達式 (constexpr) 。這些允許在編譯時計算浮點值的分子和分母,然後可以將其作為單獨的整數參數傳遞。
但是,定義一個閾值以確保浮點值接近每個值至關重要其他共享相同的分子/分母對。否則,限制浮點值作為非類型模板參數的基本原理仍然有效。
以上是為什麼浮點數值不能當 C 模板參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!