C++ 带有此指针的Memset POD结构

C++ 带有此指针的Memset POD结构,c++,C++,我有很多POD结构,其中包含很多成员变量。我没有初始化构造函数中的每个成员,而是简单地使用memset。在C++中是否有效?< /P> struct foo { foo() { std::memset(this, 0, sizeof (foo)); } int var1; float var2; double var3; // more variables.. }; 根据标准,您的结构不是POD类型,因此不允许使用memset 9类 普通类是具有默认构

我有很多POD结构,其中包含很多成员变量。我没有初始化构造函数中的每个成员,而是简单地使用memset。在C++中是否有效?< /P>
struct foo
{
    foo() { std::memset(this, 0, sizeof (foo)); }

    int var1;
    float var2;
    double var3;
    // more variables..
};

根据标准,您的结构不是POD类型,因此不允许使用memset

9类 普通类是具有默认构造函数(12.1)的类,没有非普通默认构造函数, 而且是可复制的
10 POD struct108是一个非联合类,它既是普通类又是标准布局类,并且没有 非POD结构、非POD union(或此类类型的数组)类型的非静态数据成员

由于您的类具有非平凡的默认构造函数,因此它不再是平凡的,因此不是POD类型。

最有可能是在大多数编译器上工作,没有保证,

< p>它不能保证工作,因为C++标准允许所有的零位是“代码>浮点<代码>或<代码>双< /代码>的陷阱表示的实现。因此,在这样的实现上读取这些成员将具有未定义的行为

这同样适用于实现可能在数据成员之间放置的任何填充字节——修改它们要么是未定义的行为,要么是将对象置于未定义的状态,在使用时具有未定义的行为。我忘了是哪个

不过,在实践中,它将在我所知道的所有实现中都起作用

其他答案对您的类是非POD(C++03)和非琐碎(C++11)提出了有效的观点。问题是,即使您删除了构造函数并从其他地方调用了
memset
,它仍然不能保证按照标准工作。但如果确实删除了构造函数,则可以使用聚合初始化:

foo f = {0};
这将使所有成员初始化为零值(无论是否由所有位零表示),这是有保证的