11

構造体を考えてみましょう:

struct mystruct { };

これは常に有効であるというのは本当ですか:

constexpr mystruct mystructInstance = mystruct();

つまり、POD の値の初期化はconstexpr? 同様に、構造体が次のように定義されている場合はどうですか。

struct mystruct { ~mystruct(); };

最後に、これはどうですか:

struct mystruct { mystruct(); ~mystruct(); };

ctr を constexpr として宣言していませんが、これを保証する暗黙の控除規則はありますか?

4

1 に答える 1

8

変数要件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();

このオンライン デモで説明的なエラー メッセージを確認することもできます。

于 2015-08-11T09:41:26.727 に答える