確定C 11 中的Constexpr 表達式
問題:是否可以確定C 11 表達式是否為常數表達式(constexpr) at編譯時?
答案: 是的,可以使用以下技術:
template<typename T> constexpr typename remove_reference<T>::type makeprval(T&& t) { return t; } #define isprvalconstexpr(e) noexcept(makeprval(e))
解釋:
isprvalconstexpr 宏接受一個表達式e,如果e 是純右值常數表達式(即,它可以在編譯時評估)。這是透過使用noexcept 運算子來確定的,如果e 包含任何可能評估的函數調用,而這些函數調用不具有非拋出異常規範、拋出表達式或可拋出的動態強制轉換或typeids,則該運算子傳回false。
限制:
值得注意的是,這種技術有一個限制。 noexcept 運算子有時會給出漏報,這意味著它可能會報告表達式不是常數表達式,儘管它是常數表達式。當 e 中的「潛在評估」表達式並未實際評估時,就會發生這種情況,在某些情況下,即使它們被正式視為可能評估,也會發生這種情況。
以上是我們如何在編譯時確定 C 11 表達式是否為「constexpr」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!