如何在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
答案 0 :(得分:9)
您可以在初始化整个对象的位置执行此操作。一个普通的旧数据对象就是:普通的旧数据,没有不变量,初始化或任何那些花哨的东西。如果你想要初始化,那么它不是POD。
但也许你实际上并不需要POD。也许平凡的可复制就足够了?如果您想要做的就是在对象之间进行memcpy,那么平凡的可复制性就是您正在寻找的特性,而不是POD。
答案 1 :(得分:2)
这里有一些标准解释为什么你不能在课堂内初始化POD成员。
[class]/10
:
POD结构是一个非联合类,它既是普通类又是标准布局类
[class]/6
:
普通类是一个具有默认构造函数(12.1)的类,没有非平凡的默认构造函数,并且可以轻易复制。
[class.ctor]/4
:
默认构造函数如果是非用户提供且如果:< - 它的类没有虚函数(10.3),没有虚基类(10.1)和
- 其类中没有非静态数据成员具有支撑或等于初始化程序 ,以及
- 其类的所有直接基类都有简单的默认构造函数和
- 对于类类的所有非静态数据成员(或其数组),每个这样的类都有一个普通的默认构造函数。