首頁 >後端開發 >C++ >我們可以在沒有宣告的編譯時確定 C 11 表達式是否為「constexpr」嗎?

我們可以在沒有宣告的編譯時確定 C 11 表達式是否為「constexpr」嗎?

Susan Sarandon
Susan Sarandon原創
2024-12-02 12:58:11961瀏覽

Can We Determine if a C  11 Expression is `constexpr` at Compile Time Without Declarations?

在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)表達式驗證以下條件:

  • 不存在函數呼叫具有不拋出異常規範或不構成常數表達式的變數呼叫。
  • 否存在「拋出」表達式。
  • 沒有可拋出形式的動態轉換或 typeid。

限制:

由於由於「潛在評估」表達式的保守性質,可能存在 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中文網其他相關文章!

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