ホームページ >バックエンド開発 >C++ >C 11 は式がコンパイル時定数であるかどうかを判断できますか?

C 11 は式がコンパイル時定数であるかどうかを判断できますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-05 06:04:11996ブラウズ

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

C 11 では constexpr は可能ですか?

質問:

C 11 は次のことを判断できますか?式はコンパイル時の定数式です(constexpr)?

答え:

はい、次の手法を使用して、この決定に基づいてコンパイル時のブール値を生成できます:

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

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

このマクロは、noexc 演算子を利用して、式 e が prvalue 定数式であるかどうかをチェックします。 noexc(makeprval(e)) が true と評価される場合、式 e は prvalue 定数式です。

説明:

Prvalue 定数式には特定の制限があります:

  • 関数呼び出しには非スローが必要です例外仕様。
  • スロー式は禁止されています。
  • 動的キャストおよび typeid 式は、スロー不可能な形式である必要があります。

makeprval 関数は宣言されていませんしたがって、e が prvalue 定数式の場合、makeprval(e) の呼び出しは定数式になります。したがって、noExcept 演算子は true を返します。

制限:

isprvalconstexpr マクロにはいくつかの制限があります:

  • 偽陰性が生成される可能性があります。式が定数式であるが、部分式は潜在的に評価されるものの、実際には評価されない場合
  • 一般的な constexpr 式ではなく、prvalue 定数式のみをチェックします。

以上がC 11 は式がコンパイル時定数であるかどうかを判断できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。