C ++ Struct失败POD测试

时间:2017-10-20 04:50:01

标签: c++ c++11 struct

我正在为微控制器编写代码,并且需要确保我的结构是POD。我以为我可以使用"成员初始化列表"初始化成员,但这不会传递" is_pod"测试。在下面的示例中,A是POD,B和C不是。添加" D()=默认;"到D似乎使它成为POD。但是,通过这样做,我不能再拥有一个"成员初始化列表"?结构是否有办法成为POD,并且有一个"成员初始化列表"?

#include <iostream>
#include <string>

struct A {
    int var1;
};

struct B {
    int var1;
    //B() = default;
    B() : var1(100) {}
};

struct C {
    int bar [10];
    C() : bar{0} {}
};

struct D {
    int var1;
    D() = default;
    //D(int x) : var1(x) {}
};


int main()
{
    std::cout << std::boolalpha;
    std::cout << "\nIs A a POD = " << std::is_pod<A>::value;
    std::cout << "\nIs B a POD = " << std::is_pod<B>::value;
    std::cout << "\nIs C a POD = " << std::is_pod<C>::value;
    std::cout << "\nIs tD a POD = " << std::is_pod<D>::value;
}

===更新1 ===
谢谢你的回复!所以,似乎没有办法在结构定义中初始化成员变量。以下工作,但不如在结构本身进行初始化那么优雅。

typedef struct A_ {
int var1;
} A;

A a = {
    .var1 = 100
};

1 个答案:

答案 0 :(得分:0)

POD必须是trivial type,这需要:

  

有一个或多个默认构造函数所有 琐碎或删除,至少其中一个未删除。

一个简单的构造函数描述了执行无操作。所以&#34; 在结构本身进行初始化&#34;明确反对它。

您感兴趣的硬性要求是:

  
      
  • 构造函数不是用户提供的(即,在其第一个声明中隐式定义或默认)
  •   
  • 类类型的每个非静态成员都有一个普通的默认构造函数   是它必须是默认的,所有成员构造函数都有
  •   

您必须在构造函数的定义中使用var1的默认构造函数。即var1(100)是&#34;没有bueno&#34;。 (附注:您可以使用成员ctor,但仅限于默认表单,例如var1(),这与省略相同。)

请注意,在声明对象时使用聚合初始化与将其设置为默认值相比有很大差异。设置这些变量需要一些工作,并且默认创建POD&#34;不能没有&#34;。