ホームページ >バックエンド開発 >C++ >宣言なしでコンパイル時に C 11 式が `constexpr` であるかどうかを判断できますか?

宣言なしでコンパイル時に C 11 式が `constexpr` であるかどうかを判断できますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-02 12:58:11969ブラウズ

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

C 11 での constexpr の使用: 定数式の決定

質問:

それは可能ですかC 11 式が以下に該当するかどうかを確認するためコンパイル時に宣言に依存せずに定数式 (constexpr) を使用するには?

答え:

noexc 演算子を使用すると、コンパイル時にブール値を構築できます。式が構成されているかどうかを示します。 constexpr:

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

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

説明:

noExcept(e) 式は次の条件を検証します:

  • 関数呼び出しがないこと非スロー例外仕様または定数式を構成しない変数呼び出しを使用します。
  • は存在しません。 "throw" 式。
  • スロー可能な形式の動的キャストや typeid はありません。

制限事項:

保守的な性質のため「評価される可能性がある」式では、noExcept が偽陰性を引き起こす可能性がある場合があります。例:

constexpr int a = (0 ? throw "fooled!" : 42);
constexpr bool atest = isprvalconstexpr((0 ? throw "fooled!" : 42)); // returns false

この場合、 a は正常に初期化されますが、 throw 式は実行されなくても潜在的に評価されるため、 atest は false と評価されます。

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

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