偵測C 11 中的常數表達式
在C 11 中,可以在下列期間確定表達式是否為常數表達式(>在C 11 中,可以在下列期間確定表達式是否為常數表達式(>( constexpr)編譯,這有利於最佳化程式碼並確保某些屬性。
使用noexcept(makeprval(e))
確定表達式是否為常數表達式的一種方法是使用下列巨集:
#define isprvalconstexpr(e) noexcept(makeprval(e))
其中makeprval是一個模板函數,將表達式的引用作為輸入並傳回相同的純右值type.
說明
如果e 包含常數表達式中不允許的某些操作,例如非拋出函數調用,則noexcept(e) 表達式返回false,拋出表達式,以及可拋出的動態轉換或typeid。如果呼叫 makeprval 不是常數表達式,則 noexcept 表達式也會傳回 false。
限制
雖然 isprvalconstexpr 通常在偵測純右邊值常數表達式方面很有效,但它有一個微妙的限制。如果表達式是常數表達式,但包含常數表達式中不允許的潛在計算子表達式,則可能會給出假陰性。
範例用法
以下範例示範isprvalconstexpr 的用法:
constexpr int a = (0 ? throw "fooled!" : 42); constexpr bool atest = isprvalconstexpr((0 ? throw "fooled!" : 42));
在此範例中,atest 為false,因為表達式(0 ? throw "fooled!" : 42) 不是常數表達式,即使 a的初始化成功。這是因為「邪惡」非常量子表達式拋出「愚弄!」可能會被評估,即使在這種特定情況下從未實際評估過。
以上是我的 C 11 表達式是「constexpr」嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!