vendredi 3 novembre 2017

Value initialization of nested classes

By the rules of value initialization. Value initialization occurs:

1,5) when a nameless temporary object is created with the initializer consisting of an empty pair of parentheses or braces (since C++11);

2,6) when an object with dynamic storage duration is created by a new-expression with the initializer consisting of an empty pair of parentheses or braces (since C++11);

3,7) when a non-static data member or a base class is initialized using a member initializer with an empty pair of parentheses or braces (since C++11);

4) when a named variable (automatic, static, or thread-local) is declared with the initializer consisting of a pair of braces.

Trivial example

struct A{
    int i;
    string s;
    A(){};
};

A a{} 
cout << a.i << endl // default initialized value

without explicitly declared constructor and left with defaulted default ctor // compiler generated one we get.

struct A{
    int i;
    string s;

};
A a{};
cout << a.i << endl // zero-initialized value

However using antoher struct.

struct A{
    int i;
    string s;

};

struct B{
    A a;
    int c;
};

B a{};
cout << a.a.i << endl // default initialized , even tho we did not , int struct B , declared A a{}.

The value of a.i is zero-initialized, even without using {} / () construct, which goes against rules ( if i am not mistaken ).

Using same logic on struct B:

struct A{
    int i;
    string s;

};

struct B{
    A a;
    int c;
};

B b;
cout << b.c << endl; // default inicialized

We get behavior according to rules.

The last example:

struct A
{
    int i;
    A() { } 
};

struct B { A a; }; 

std::cout << B().a.i << endl;

B().a.i is also zero-initialized while we explicitly declared constructor and its not deleted.

Why are the these values getting zero-initialized? By rules stated here they should be default-initialized not zero-initialized.

Thanks for answers.

Aucun commentaire:

Enregistrer un commentaire