首頁 >後端開發 >C++ >C 11 能否確定表達式是否為編譯時常數?

C 11 能否確定表達式是否為編譯時常數?

Patricia Arquette
Patricia Arquette原創
2024-12-05 06:04:111000瀏覽

Can C  11 Determine if an Expression is a Compile-Time Constant?

constexpr 在 C 11 中可能嗎?

問題:

C 11能否確定是否表達式是編譯時常數表達式(constexpr)?

答案:

是的,可以使用以下技術根據此確定生成編譯時布爾值:

template<typename T> 
constexpr typename remove_reference<T>::type makeprval(T &&& t) {
  return t;
}

#define isprvalconstexpr(e) noexcept(makeprval(e))

此巨集使用noexcept 運算子檢查表達式e 是否為純右值常數表達式。如果 noexcept(makeprval(e)) 計算結果為 true,則表達式 e 為純右值常數表達式。

說明:

純右值常數表達式有一定的限制:

  • 函數呼叫必須不拋出異常異常規範。
  • 禁止拋出表達式。
  • 動態轉換和 typeid 表達式必須採用不可拋出的形式。

未宣告 makeprval 函數as noexcept,因此如果 e 是純右值常數表達式,則呼叫 makeprval(e) 將是常數表達式。因此,noexcept 運算子將傳回 true。

限制:

isprvalconstexpr 巨集有一些限制:

  • 它可能會產生漏報在表達式是常數表達式表達式可能被計算但實際上未被計算的情況下評估。
  • 它只檢查純右值常數表達式,而不檢查一般的 constexpr 表達式。

以上是C 11 能否確定表達式是否為編譯時常數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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