Constexpr 處理非 constexpr 標準函式庫函數的編譯器擴充是否一致?
在 C 11 中,標準草稿似乎允許處理標準函式庫函數作為 constexpr,即使它們沒有明確標記為 constexpr。然而,這種立場已經演變了。
C 14 演變
在 C 14 中,明確指出非標準要求的函數不應透過以下方式宣告為 constexpr實作。 C 14 標準草案第 17.6.5.6 節對此進行了概述:
An implementation shall not declare any standard library function signature as constexpr except for those where it is explicitly required.
做出此決定是為了防止實現分歧,特別是 SFINAE 的使用導致不同的可觀察行為。
GCC 的實作
GCC 之前處理過某些非 constexpr標準函式庫函數作為 constexpr 基於早期的 LWG 2013 提案決議。然而,這種行為在 C 14 中不再被認為是符合的。
嚴格模式下警告不存在
儘管存在不符合性,GCC 不會在嚴格一致性模式下產生警告( -std=c 11 -迂腐) 。這可能是一個疏忽,將在未來的更新中解決。
內在函數豁免
編譯器內在函數不受與標準函式庫函數相同的規則的約束。因此,使用像這樣的內部函數:
static constexpr double a = __builtin_cos(3.);
應該被認為是符合的。
結論
目前將非 constexpr 標準函式庫函數視為 constexpr C 14 中的不合格擴展。雖然 GCC 根據先前的提案決議在 C 11 中允許這樣做,預計此擴充將被刪除或修改以符合目前的 C 14 標準。
以上是C 14 編譯器能否將非 constexpr 標準函式庫函數一致地視為「constexpr」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!