Does C++ do value initialization of a POD typedef?

前端 未结 2 1501
栀梦
栀梦 2020-12-28 22:08

Does C++ do value initialization on simple POD typedefs?

Assuming

typedef T* Ptr;

does

Ptr()

do v

相关标签:
2条回答
  • 2020-12-28 22:54
    #include <iostream>
    struct Foo {
        char bar;
        char baz;
        char foobar;
        // the struct is a POD
        //virtual void a() { bar='b'; }
    };
    
    int main() {
        Foo o1;
        Foo o2 = Foo();
    
        std::cout << "O1: " << (int)o1.bar <<" "<< (int)o1.baz <<" "<< (int)o1.foobar << std::endl;
        std::cout << "O2: " << (int)o2.bar <<" "<< (int)o2.baz <<" "<< (int)o2.foobar << std::endl;
        return 0;
    }
    

    Output:

    O1: -27 -98 0

    O2: 0 0 0

    Adding () propagates initializer calls to all POD members. Uncomenting the virtual method changes output to:

    O1: -44 -27 -98

    O2: -71 -120 4

    However adding destructor ~Foo() does not suppress the initialization, although it creates non-POD object (output similar to first one).

    0 讨论(0)
  • 2020-12-28 22:59

    It does. For a type T, T() value-initializes an "object" of type T and yields an rvalue expression.

    int a = int();
    assert(a == 0);
    

    Same for pod-classes:

    struct A { int a; };
    assert(A().a == 0);
    

    Also true for some non-POD classes that have no user declared constructor:

    struct A { ~A() { } int a; };
    assert(A().a == 0);
    

    Since you cannot do A a() (creates a function declaration instead), boost has a class value_initialized, allowing to work around that, and C++1x will have the following, alternative, syntax

    int a{};
    

    In the dry words of the Standard, this sounds like

    The expression T(), where T is a simple-type-specifier (7.1.5.2) for a non-array complete object type or the (possibly cv-qualified) void type, creates an rvalue of the specified type, which is value-initialized

    Since a typedef-name is a type-name, which is a simple-type-specifier itself, this works just fine.

    0 讨论(0)
提交回复
热议问题