値とデフォルトとゼロの初期化について非常に混乱しています。特に、異なる標準C ++ 03とC ++ 11(およびC ++ 14)を採用する場合。
私はここで本当に良い答えを引用して拡張しようとしています値-/デフォルト-/ゼロ-初期化C ++ 98とC ++ 03誰かが記入するのを手伝ってくれるなら多くのユーザーを助けるので、それをより一般的にしますいつ何が起こるかについての概要を把握するためにギャップが必要でしたか?
一言で言えば例による完全な洞察:
new演算子によって返されるメモリが初期化される場合もあれば、新しい型がPOD(単純な古いデータ)であるかどうか、またはPODメンバーを含み、を使用しているクラスであるかどうかに依存しない場合もあります。コンパイラーが生成したデフォルトのコンストラクター。
- ではC ++ 1998:初期化の2種類があるゼロとデフォルトの初期化は、
- C ++ 2003の初期化の3種類、値初期化を加えました。
- C ++ 2011 / C ++ 2014のみリストの初期化は、添加し、そしてための規則値- / default- /ゼロ初期化は、ビットを変更しました。
仮定:
struct A { int m; };
struct B { ~B(); int m; };
struct C { C() : m(){}; ~C(); int m; };
struct D { D(){}; int m; };
struct E { E() = default; int m;}; /** only possible in c++11/14 */
struct F {F(); int m;}; F::F() = default; /** only possible in c++11/14 */
C ++ 98コンパイラでは、次のことが発生するはずです。
new A
-不確定な値(A
POD)new A()
-ゼロ-初期化new B
-デフォルトの構成(B::m
初期化されていない、B
PODではない)new B()
-デフォルトの構成(B::m
初期化されていません)new C
-デフォルトの構成(C::m
ゼロで初期化され、C
非POD)new C()
-デフォルトの構成(C::m
ゼロで初期化されます)new D
-デフォルトの構成(D::m
初期化されていない、D
PODではない)new D()
-デフォルトの構成?(D::m
初期化されていません)
C ++ 03準拠のコンパイラでは、次のように動作するはずです。
new A
-不確定な値(A
POD)new A()
--value-initializeA
。これはPODであるため、ゼロ初期化です。new B
-デフォルト-初期化(B::m
初期化されないまま、B
非POD)new B()
-値-初期化B
ユーザ定義とは対照的にそのデフォルトCTOR以降のすべてのフィールドをゼロに初期化コンパイラが生成されます。new C
C
--default- 初期化します。これはデフォルトのctorを呼び出します。(C::m
ゼロで初期化され、C
非PODです)new C()
C
--value- 初期化します。これはデフォルトのctorを呼び出します。(C::m
ゼロで初期化されます)new D
-デフォルトの構成(D::m
初期化されていない、D
PODではない)new D()
-値-Dを初期化しますか?、デフォルトのctorを呼び出します(D::m
初期化されていません)
イタリック値と?不確実です、これを修正するのを手伝ってください:-)
C ++ 11準拠のコンパイラでは、次のように動作するはずです。
??? (私がここから始めたら、とにかくうまくいかないので助けてください)
C ++ 14準拠のコンパイラでは、物事はそうのように動作するはずです: ??? (ここから始めたら、とにかくうまくいかないので助けてください) (回答に基づくドラフト)
new A
A
--default-コンパイラgenを 初期化します。ctor、(A::m
初期化されていないまま)(A
PODです)new A()
--value -initializeA
、これはゼロです- [dcl.init] / 8の2.ポイント以降の初期化new B
B
--default-コンパイラgenを 初期化します。ctor、(B::m
初期化されていないまま)(B
非POD)new B()
-値の初期化B
ユーザ定義とは対照的にそのデフォルトCTOR以降のすべてのフィールドをゼロに初期化コンパイラが生成されます。new C
C
--default- 初期化します。これはデフォルトのctorを呼び出します。(C::m
ゼロで初期化され、C
非PODです)new C()
C
--value- 初期化します。これはデフォルトのctorを呼び出します。(C::m
ゼロで初期化されます)new D
-デフォルト-初期化D
(D::m
初期化されていない、D
PODではない)new D()
D
--value -initialize 、デフォルトのctorを呼び出します(D::m
初期化されていません)new E
--default-E
compを呼び出すを初期化します。gen。ctor。(E::m
初期化されておらず、Eは非PODです)new E()
--value -initializeE
、ゼロ- [dcl.init] / 8のE
2ポイント以降に初期化)new F
--default-F
compを呼び出すを初期化します。gen。ctor。(F::m
初期化されておらず、F
PODではありません)new F()
-値初期化F
、デフォルトの初期化は、F
1.ポイント以降[dcl.init] / 8(F
それは、ユーザが宣言はなく、明示的にデフォルトまたはその最初の宣言に削除された場合CTOR機能は、ユーザが提供される。リンク)