C++ c++;11普通旧对象默认值

C++ c++;11普通旧对象默认值,c++,c++11,initialization,C++,C++11,Initialization,如何在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

如何在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
A类{
公众:
int theAnswer;//这是未初始化的
};
静态_断言(std::is_pod::value,“A必须是普通的旧对象”);
B类{
公众:
int theAnswer{42};//这应该初始化为42
};
静态断言(std::is_pod::value,“B必须是普通的旧对象”);//错误
C类{
公众:
C():answer{42}{}//显然,这不是一个微不足道的默认构造函数,因此它不起作用
国际解答;
};
static_assert(std::is_pod::value,“C必须是普通的旧对象”);//错误

在初始化整个对象的位置执行此操作。一个普通的旧数据对象就是:普通的旧数据,没有不变量,没有初始化,也没有任何花哨的东西。如果你想要初始化,那么它不是POD


但也许你实际上并不需要一个豆荚。也许简单的可复制就足够了?如果您只想在对象之间使用memcpy,那么您要寻找的是可复制的特性,而不是POD。

下面是一些标准说明,解释为什么不能在类本身内部初始化POD成员

[class]/10

POD结构是一个非联合类,它既是一个普通类,也是一个标准布局类

[class]/6

普通类是一个具有默认构造函数(12.1)、没有非普通默认构造函数且可复制的类

[class.ctor]/4

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


是的,你说得对。对于我的情况来说,使用memcpy进行简单的可复制已经足够了。不幸的是,我的编译器(gcc 4.7.3)不支持std::is\u littley\u copyableNitpicky:POD代表普通的旧数据()