C 11 での定数式の検出
C 11 では、式が定数式 (constexpr) であるかどうかを判定できます。コンパイルは、コードを最適化し、確実な動作を保証するのに有益です。 properties.
noExcept(makeprval(e)) の使用
式が定数式かどうかを判断する 1 つの方法は、次のマクロを使用することです:
#define isprvalconstexpr(e) noexcept(makeprval(e))
ここで、makeprval は式への参照を入力として受け取り、同じ prvalue を返すテンプレート関数です。 type.
説明
e に定数式で許可されていない特定の操作 (非スロー関数呼び出しなど) が含まれている場合、noExcept(e) 式は false を返します。 throw 式、およびスロー可能な動的キャストまたは typeid。 makeprval への呼び出しが定数式でない場合、noexc 式も false を返します。
制限事項
isprvalconstexpr は一般に prvalue 定数式の検出に効果的ですが、微妙な制限があります。式が定数式であるにもかかわらず、定数式で許可されていない潜在的に評価される部分式が含まれている場合、偽陰性が発生する可能性があります。
使用例
次の例isprvalconstexpr:
constexpr int a = (0 ? throw "fooled!" : 42); constexpr bool atest = isprvalconstexpr((0 ? throw "fooled!" : 42));
の使用法を示します。この例では、式 (0 ? throw "fooled!" : 42) は、 a の初期化が成功したとしても、定数式ではありません。これは、「evil」非定数部分式が「fooled!」をスローするためです。この特定のケースでは実際には評価されませんが、潜在的に評価される可能性があります。
以上が私の C 11 式は「constexpr」ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。