2013-07-18 15 views
12

段落8.5p7で8.5.p7といくつかの説明が必要:T型のオブジェクトの値が初期化C++ 11標準状態のC++ 11標準

することを意味:

  • Tがユーザ提供のコンストラクタ (12.1)を持つ(おそらくcv修飾された)クラス型(9節)である場合、Tのデフォルトのコンストラクタが呼び出されます(Tが持つ場合は の初期化は不正です)。アクセシブルなデフォルトはありません コンストラクタ);

  • Tは、ユーザー提供のコンストラクタなし(おそらくCV修飾)非組合クラス型 ある場合、そのオブジェクトは Tの暗黙的に宣言されたデフォルトコンストラクタ が非であれば、ゼロを初期化していますそのコンストラクタが呼び出されます。

  • Tが配列タイプの場合、 各要素は値で初期化されます。

  • その他の場合、オブジェクトはゼロ初期化された です。

は、私は上記の太字で文字を理解する問題を抱えています。 Tの暗黙的なデフォルトのコンストラクタの追加の呼び出しがゼロ初期化を変更する方法は、この場合発生しましたか?

答えて

16

ここでは具体的な例を示します

class A { 
    int a; 
public: 
    A() : a(1) {} 
}; 

class B { 
    int b; 
    A c; 
}; 

Bがこのカテゴリーに該当する - それは、ユーザ提供のコンストラクタのない非組合クラス型です。したがって、Bが値で初期化されている場合は、最初に0で初期化されるため(bc.aは0に設定されます)、デフォルトコンストラクタが呼び出されます(Aのコンストラクタを呼び出し、c.aを1 )。誰が今までゼロ初期化とデフォルトコンストラクタとの間のオブジェクトを見ることができないように、これらは、(1、0とc.ab設定されます)オプティマイザによって単一のステップに結合されるかもしれないas-ifルールによって

、 。

+0

+1かなりクリア – Belloc

+0

VC++ではこれが正しく実装されていないことに注意してください。 C++ 98では初期化ルールが異なり、VC++でもまだそれらを実装しています。 [バグレポート](http://connect.microsoft.com/VisualStudio/feedback/details/746973/incorrect-c-11-value-initialization-for-type-with-implicitly-declared-but-non-trivial-default -constructor) – bames53

+0

これは私にはちょっと時間がかかりましたが、暗黙的/デフォルトのctorsが非暗黙のベースctorを呼び出すかもしれないという事実が鍵です。私の+1 –

5

Tは、独自の明示的なデフォルトコンストラクタを持たないかもしれませんが、Uから派生したり、クラスタイプVのメンバを持っています。

+0

でも、ゼロ初期化時にそのコンストラクタがオブジェクトをどのように変更できますか? –

+0

「オブジェクトを変更する」という意味がわかりません。何かを変更するには、最初に値を持っていなければなりません。コンストラクタは何も変更せず、初期値を設定します。 –

+0

Ah - ゼロ初期化されていると言うと、 'Foo * foo = 0'と同じではありませんか? –

4
struct S { 
    int a, b; 
    S() : b(10) {} 
}; 

struct T { 
    S s; 
}; 

int main() { 
    S s{}; 
    T t{}; 
} 

tユーザー提供のコンストラクタを持っていない初期化された値とTです。しかし、Tの暗黙的に宣言されたデフォルトのコンストラクタは自明ではありません。

sも値は初期化されますが、Sにはユーザーが提供するコンストラクタがあります。

s.aは不確定な値になります。 t.s.aは、デフォルトのコンストラクタの呼び出しに先立つ0の初期化のためにゼロです。s.bt.s.bの両方が値10に設定されています。

関連する問題