非 Constexpr 標準函式庫函數可以在 GCC 中被視為 Constexpr 嗎?
GCC 編譯用非constexpr 初始化靜態constexpr 變數的程式碼不會發出警告的標準函式庫函數,例如範例中的函數下面:
根據C 11 和C 14標準,非constexpr 函數不能在常數表達式中使用。然而,GCC 將一些內建標準函式庫函數視為 constexpr,即使它們沒有明確標記為 constexpr。
此行為是 C 14 中的不合格擴展。 C 14 標準草案禁止以下實作除非明確要求,否則將標準函式庫函數簽章宣告為 constexpr。
在 C 11 中,共識從允許此擴展轉變為禁止它。這是因為不同的實作以不同的方式處理函數可能會導致使用 SFINAE 時的行為差異。
GCC 最初依賴早期提出的 LWG 問題 2013 的解決方案,該解決方案允許實作將任何函數宣告為 constexpr(如果它滿足某些條件)限制。這就是為什麼 GCC 在嚴格一致性模式下將這些函數視為 constexpr。
但是,C 14 中的分辨率發生了變化,該擴展現在被認為是不合格的。 GCC 預計會解決此問題,並發出警告或在嚴格一致性模式下停用此行為。
請注意,此問題不涵蓋編譯器內在函數,因此應允許在 constexpr 上下文中使用它們。
以上是GCC 是否允許在 Constexpr 上下文中使用非 Constexpr 標準函式庫函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!