Can a member struct be zero-init from the constructor initializer list without calling memset?

前端 未结 3 652
时光说笑
时光说笑 2020-12-29 05:53

Let\'s say I have the following structure declaration (simple struct with no constructor).

struct Foo
{
    int x;
    int y;
    int z;
    char szData[DATA         


        
相关标签:
3条回答
  • 2020-12-29 06:14

    Yes, this is defined behaviour according to the standard. 12.6.2 [class.base.init] / 3 : "if the expression-list of the mem-initializer is omitted, the base class or member subobject is value-initialized."

    Be warned, though, if Foo wasn't a POD-type but still had no user-declared constructor (e.g. it had a std::string type) then some very popular compilers would not correctly value-initialize it.

    All compilers that I know of do correctly perform value-initialization of POD members when you use () as the initializer in a constructor initializer-list.

    0 讨论(0)
  • 2020-12-29 06:25

    It's the equivalent of float foo = float();

    It will zero the object, even if the value representation is not all-bits-zero. I.e. it's even better than memset().

    0 讨论(0)
  • 2020-12-29 06:33

    i find it hard to read the standard, but I found it I think:

    To value-initialize an object of type T means:
    if T is a non-union class type without a user-declared constructor, then every non-static data member and base- class component of T is value-initialized Value-initialization for such a class object may be implemented by zero-initializing the object and then calling the default constructor.

    Section 8.5

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