zero-initialize



  • Abend,

    struct S{ int i; };
    
    int main()
    {
    	S s;
    	std::cout << s.i; // irgendetwas
    
    	std::cout << S().i; // 0
    }
    

    Ich verstehe gerade nicht, wieso das Datenelement des temporären Objekts mit 0 initialisiert wird. Was ist da der Hintergrund? Ich finde die entsprechende Stelle im Draft momentan nicht (falls jemand die Stelle parat hat, bitte posten).

    Danke im Voraus.



  • Möglicherweise einfach Zufall?



  • Ethon schrieb:

    Möglicherweise einfach Zufall?

    Ne :p Chandler Carruth erklärt es am Ende seines Vortrags (ab 50 Min.), aber ich kann ihm nicht ganz folgen. 🤡



  • 8.5.10: An object whose initializer is an empty set of parentheses, i.e., (), shall be value-initialized.

    8.5.7 To value-initialize an object of type T means:
    — if T is a (possibly cv-qualified) class type (Clause 9) with a user-provided constructor (12.1), then the default constructor for T is called (and the initialization is ill-formed if T has no accessible default
    constructor);
    — if T is a (possibly cv-qualified) non-union class type without a user-provided constructor, then the object is zero-initialized and, if T’s implicitly-declared default constructor is non-trivial, that constructor is
    called.
    — if T is an array type, then each element is value-initialized;
    — otherwise, the object is zero-initialized.

    8.5.5 To zero-initialize an object or reference of type T means:
    — if T is a scalar type (3.9), the object is set to the value 0 (zero), taken as an integral constant expression, converted to T
    — if T is a (possibly cv-qualified) non-union class type, each non-static data member and each base-class
    subobject is zero-initialized and padding is initialized to zero bits;

    #include <iostream>
    
    struct S{ int i; };
    struct T{ int i; public: T() {} };
    
    int main()
    {
        S s;
        std::cout << s.i << "\n"; // irgendetwas
        std::cout << S().i << "\n"; // 0
    
        T t;
        std::cout << t.i << "\n"; // irgendetwas
        std::cout << T().i << "\n"; // irgendetwas
    }
    

    // edit: Yeah, endlich wieder mal was g'lernt 😉



  • Danke für die entsprechenden Textstellen Swordfish, jetzt habe ich es auch verstanden. 🙂


Log in to reply