偵測C 11 中的constexpr 表達式
在C 11 中,判斷表達式是否符合常數表達式(constexpr) 的條件至關重要在編譯時。這些知識有助於各種最佳化技術,並能夠產生編譯時計算值。
is_constexpr 的可行性
產生編譯時計算值的可行性的擔憂是基於 C 11 表達式的 constexpr 性質的布林值。雖然之前的 Stack Overflow 問題涉及這個主題,但明確的答案仍然難以捉摸。
解決方案:noexcept 技巧
解決方案涉及利用noexcept 表達式,該表達式計算如果提供的表達式包含違反constexpr 要求的特定元素,則返回false。這些元素包括:
透過故意製作函數模板non-noexcept 並將其應用到表達式中,可以利用noexcept(e)表達式來檢測 constexpr表達式。此方法專門識別純右值常數表達式。
限制
必須注意與此方法相關的限制:
範例實作
以下程式碼片段示範了建議的解決方案:
template<typename T> constexpr typename remove_reference<T>::type makeprval(T && t) { return t; } #define isprvalconstexpr(e) noexcept(makeprval(e))
儘管存在局限性,但這種方法提供了對C 11 表達式的constexpr 性質的寶貴見解,使程式設計師具有更強的控制和最佳化能力。
以上是C 11 的「noexcept」技巧可以可靠地偵測「constexpr」表達式嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!