C++ 结构未通过 POD 测试

Dav*_*idH 5 c++ struct c++11

我正在为微控制器编写代码,需要确保我的结构是 POD。我以为我可以使用“成员初始化列表”来初始化成员,但这没有通过“is_pod”测试。在下面的示例中,A 是 POD,B 和 C 不是。添加“D() = 默认值;” to 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;
}
Run Code Online (Sandbox Code Playgroud)

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

typedef struct A_ {
int var1;
} A;

A a = {
    .var1 = 100
};
Run Code Online (Sandbox Code Playgroud)

luk*_*k32 1

POD 必须是普通类型,这需要:

具有一个或多个默认构造函数,所有这些构造函数要么是平凡的,要么是已删除的,并且至少其中一个未删除。

一个简单的构造函数有一个不执行任何操作的描述。因此,“在结构本身中进行初始化”是明确反对的。

你的兴趣的硬性要求是:

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

您必须var1在构造函数的定义中使用默认构造函数。即var1(100)“no bueno”。(旁注:您可以使用成员构造函数,但只能以默认形式var1(),例如,这与省略它相同)。

请注意,在对象声明中使用聚合初始化与将其设置为默认值有一个主要区别。设置这些变量需要一些工作,并且默认创建的 POD“不能没有”。