在C 11 中使用constexpr:確定常量表達式
問題:
是否可行地確定C 11 表達式是否符合常數表達式的條件(constexpr)在編譯時不依賴聲明?
答案:
利用noexcept 運算符,可以建構一個編譯時布林值,指示是否表達式構成constexpr:
template<typename T> constexpr typename remove_reference<T>::type makeprval(T&& t) { return t; } #define isprvalconstexpr(e) noexcept(makeprval(e))
解釋:
noexcept(e)表達式驗證以下條件:
限制:
由於由於「潛在評估」表達式的保守性質,可能存在 noexcept 可能提供假陰性的情況。例如:
constexpr int a = (0 ? throw "fooled!" : 42); constexpr bool atest = isprvalconstexpr((0 ? throw "fooled!" : 42)); // returns false
在這種情況下,a 已成功初始化,但 atest 的計算結果為 false,因為 throw 表達式可能會被計算,即使它從未被執行。
以上是我們可以在沒有宣告的編譯時確定 C 11 表達式是否為「constexpr」嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!