変数の要件constexpr
は次のとおりです。
constexpr 変数は、次の要件を満たす必要があります。
- その型は LiteralType でなければなりません。
- すぐに構築するか、値を割り当てる必要があります。
- コンストラクターのパラメーターまたは割り当てられる値には、リテラル値、constexpr 変数、および関数のみが含まれている必要があります。
- オブジェクトの構築に使用されるコンストラクター (暗黙的または明示的) は、constexpr コンストラクターの要件を満たさなければなりません。明示的なコンストラクターの場合は、constexpr を指定する必要があります。
あなたの3つの構造体を考えると:
struct mystruct_1 { };
struct mystruct_2 { ~mystruct_2(); };
struct mystruct_3 { mystruct_3(); ~mystruct_3(); };
mystruct_1
ですLiteralType
。したがって、以下は有効であり、コンパイルされます。
constexpr mystruct_1 mystructInstance_1 = mystruct_1();
mystruct_2
自明でないデストラクタがあるため、 ではありません。LiteralType
したがって、以下は無効であり、コンパイルに失敗します。
constexpr mystruct_2 mystructInstance_2 = mystruct_2();
同じことが にも当てはまりますmystruct_3
。さらに、これは集約constexpr
ではなく、コンストラクターを提供しません。したがって、次も無効であり、コンパイルに失敗します。
constexpr mystruct_3 mystructInstance_3 = mystruct_3();
このオンライン デモで説明的なエラー メッセージを確認することもできます。