[英]C++ Struct fails POD test
我正在为微控制器编写代码,需要确保我的结构是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 ===
谢谢你的回复! 所以,似乎没有办法在结构定义中初始化成员变量。 以下工作,但不如在struct本身进行初始化那样优雅。
typedef struct A_ {
int var1;
} A;
A a = {
.var1 = 100
};
POD必须是一个微不足道的类型 ,这需要:
有一个或多个默认构造函数 , 所有 默认构造函数 都是 平凡的或删除的,并且至少有一个未删除。
一个简单的构造函数有一个不执行任何操作的描述。 所以“ 在结构本身中进行初始化 ”明确地反对它。
您感兴趣的硬性要求是:
- 构造函数不是用户提供的(即,在其第一个声明中隐式定义或默认)
- 类类型的每个非静态成员都有一个简单的默认构造函数,它必须是默认的,所有成员构造函数都有
您必须在构造函数的定义中使用var1
默认构造函数。 即var1(100)
是“no bueno”。 ( 旁注:您可以使用成员ctor,但只能使用默认格式,例如var1()
,这与省略它相同 )。
请注意,在声明对象时使用聚合初始化与将其设置为默认值相比存在重大差异。 设置这些变量需要一些工作,POD的默认创建“不能没有”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.