首頁 >後端開發 >C++ >我的 C 11 表達式是「constexpr」嗎?

我的 C 11 表達式是「constexpr」嗎?

Linda Hamilton
Linda Hamilton原創
2024-12-02 20:32:15128瀏覽

Is My C  11 Expression a `constexpr`?

偵測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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn