役に立ちましたか?

解決

C ++ 11 [Class.Clase] / 5状態:

default classのためのコンストラクタは、引数なしで呼び出すことができるClass Xのコンストラクタです。 Class Xのユーザー宣言コンストラクタがない場合、パラメータを持たないコンストラクタはデフォルトで暗黙的に宣言されます(8.4)。暗黙的に宣言されたデフォルトコンストラクタは、そのクラスのXメンバーです。 Class inline publicのデフォルトのデフォルトコンストラクタは、次の場合に削除済みとして定義されています。

  • Xは、単語以外のデフォルトコンストラクタ
  • を持つバリアントメンバーを持つ共用体のようなクラスです。
  • brace-or-i-iinitizer を持つ静的な非静的データメンバーは参照型、
  • brace-or-i-iinitizer のないconst-repended型(またはその配列)の非バリアント非静的データメンバーに、ユーザーに提供されたデフォルトコンストラクタがありません。李>
  • Xは共用体であり、そのすべてのバリアントメンバーはconst-aged型(またはその配列)、
  • のすべてです。
  • Xは非共用体クラスであり、匿名ユニオンメンバーのすべてのメンバーはconst-aged型(またはその配列)、
  • です。
  • 任意の直接または仮想基本クラス、または brace-or-iinitizer を持つ非静的データメンバには、クラスタイプX(またはその配列)があり、Mにはデフォルトのコンストラクタがありません。 Mのデフォルトのコンストラクタに適用されるオーバーロード解決(13.3)は、デフォルトのデフォルトコンストラクタまたはデフォルトのデフォルトコンストラクター、または
  • から削除されていない関数またはアクセスできない関数にも発生します。
  • 任意の直接または仮想基本クラスまたは非静的データメンバーには、デフォルトのデフォルトコンストラクターから削除された、またはアクセスできないデストラクタとの型があります。

既定のコンストラクタは、ユーザーが指定していない場合は些細なコンストラクタです。

  • そのクラスには仮想関数(10.3)がない(10.3)、仮想基本クラス(10.1)、
  • クラスの非静的データメンバーはブレースまたは等演算子を持ち、
  • クラスのすべての直接基本クラスは簡単なデフォルトコンストラクタ、
  • を持っています
  • クラスタイプ(またはその配列)のクラスのすべての非静的データメンバーに対して、そのような各クラスには簡単なデフォルトコンストラクタがあります。

それ以外の場合、デフォルトのコンストラクタは非些細なです。

OP内のStruct Mでは非自明のデフォルトコンストラクタがありますので、

Point() {}
.

Point のメンバーを含む共用体のデフォルトのデフォルトコンストラクタは、最初の箇条書きに従って削除されるように定義されます。

  • Pointは、単語以外のデフォルトコンストラクタ
  • を持つバリアントメンバーを持つ共用体のようなクラスです。

は、OPが誤って形成されているプログラムを提示した。

しかし、委員会は、コアワーキンググループ問題1623

12.1 [Class.Class]段落5、

に準拠

クラスX用のデフォルトのデフォルトコンストラクタは、以下の場合に削除済みとして定義されています。

  • Xは、単語以外のデフォルトコンストラクターを持つバリアントメンバーを持つ共用体のようなクラス、

  • です。

  • ...

  • Xは共用体であり、そのすべてのバリアントメンバーはConst認定型(またはその配列)、

  • のものです。

  • Xは非共用体クラスであり、匿名ユニオンメンバーのすべてのメンバーはConst認定の型(またはその配列)、

  • です。

  • ...

非静的データメンバの初期化装置の存在は、 Mem-Initializer の道徳的に相当するため、これらの規則は、生成されたコンストラクタを削除されたときにUnionメンバーがあるときに定義しないように変更されるべきです。非静的データメンバのイニシャライザ。 (9.5 [Class.Union]の段落2-3および7.1.6.1 [DCL.TYPE.CV]の非規範的な参照は、この制限が変更された場合にも更新する必要があるパラグラフ2の段落2の非規範です。)

組合中のすべてのメンバーが構成不可能な型を持っている場合、非静的データメンバのイニシャライザまたはユーザー提供のコンストラクタのいずれかを必要とする9.5 [Class.Union]に要件を追加することも役立ちます。

より一般的な注意事項は、メンバーに自明でないデフォルトコンストラクタがあるため、デフォルトのコンストラクタが削除されたのですか? Union自体はどのメンバーがアクティブなものであるかわからず、デフォルトの構造はメンバーを初期化しません(no ブレースまたは等能力を仮定する)。アクティブメンバーの有効期間を管理するための組合の「所有者」次第です。

ユーザー提供のコンストラクタを必要としていることは、理にかなっていないデザインパターンを強制しています。同じ行に沿って、メンバーが自明のデストラクタがあるため、デフォルトのデストラクタが削除されたと定義されているのはなぜですか。 UNIONにユーザー提供のコンストラクタも持っている場合にのみ適用されている場合は、この制限に同意するでしょう。

発行1623には、委員会がおそらく問題があると考えているというステータス「Drafting」があります。このような Brace-またはInitializer がユニオンメンバーのためにを許可することを示していますか? - しかし、解像度の適切な表現を決定する時間をまだ献身的ではありません。確かに、段落は現在のC ++ 14ドラフトN3936([Class.Cluctor] / 4)において大きく同じです。より簡単な「潜在的に構築されたサブオブジェクト」

両方のコンパイラの動作は厳密に適合していませんが、聖書は標準の精神で行動することを検討します。 GCCは、削除されたデフォルトコンストラクタと brace-or-iinitializer

の組み合わせによって混乱しているように見えます。

GCCは、標準に準拠していて、プログラムをILL形成されたとして診断したり、CLANGの振る舞いをエミュレートしたり、 BRANCEまたはEQUALISIZER から適切なコンストラクタを生成したりする必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top