c++11普通老对象的默认值

c++11 plain old object default value

本文关键字:默认值 对象 c++11      更新时间:2023-10-16

如何在C++11中初始化POD(纯旧数据)的成员变量?

class A {
public:
    int theAnswer; // this is not initialized
};
static_assert(std::is_pod<A>::value, "A must be a plain old object");
class B {
public:
    int theAnswer { 42 }; //  this should initialize to 42
};
static_assert(std::is_pod<B>::value, "B must be a plain old object"); // ERROR
class C {
public:
    C() : theAnswer { 42 } { } // Obviously, this is not a trivial default constructor, so it does not work
    int theAnswer;
};
static_assert(std::is_pod<C>::value, "C must be a plain old object"); // ERROR

在初始化整个对象的地方执行。一个普通的老数据对象就是:普通的旧数据,没有不变量、初始化或任何花哨的东西。如果您想要初始化,那么它不是POD。

但也许你实际上并不需要POD。也许微不足道的可复制性就足够了?如果你想做的只是对象之间的内存,那么你要寻找的特性是可复制性,而不是POD。

这里有一些标准解释了为什么不能在类内部初始化POD成员。

[class]/10:

POD结构是一个非并集类,既是平凡类又是标准布局类

[class]/6:

平凡类是一个具有默认构造函数(12.1)、没有非平凡默认构造函数并且可平凡复制的类。

[class.ctor]/4:

如果默认构造函数不是用户提供的,并且:
--它的类没有虚拟函数(10.3),也没有虚拟基类(10.1),并且
--其类的非静态数据成员都没有大括号或相等的初始值设定项,并且
--其类的所有直接基类都有琐碎的默认构造函数,并且
--对于类类型(或其数组)的类的所有非静态数据成员,每个此类都有一个琐碎的默认构造函数。