ホームページ > バックエンド開発 > C++ > 私の C 11 式は「constexpr」ですか?

私の C 11 式は「constexpr」ですか?

Linda Hamilton
リリース: 2024-12-02 20:32:15
オリジナル
172 人が閲覧しました

Is My C  11 Expression a `constexpr`?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート