【发布时间】:2018-04-01 05:43:23
【问题描述】:
我正在为微控制器编写代码,并且需要确保我的结构是 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
};
【问题讨论】:
-
重读时有点神秘。我认为您因缺少默认构造函数而被取消 POD。除非您通过显式声明默认构造函数来反击,否则声明构造函数会删除默认构造函数。
-
我相信你不能在 pod-type struct 中进行任何自定义初始化。
-
嗯...
D d = {42};编译,“成员初始化列表”是什么意思?请注意,POD 基本上是指您在 C 中获得的内容,但类可以具有非虚拟成员函数,不包括特殊的构造函数和析构函数 -
我在这里试过
http://cpp.sh/8exzr,它是@user4581301 和@K。基尔兹如是说。在构造函数初始化列表(冒号后的所有内容)中提供默认初始化,将使其成为非 POD。赞成这篇文章,因为我认为这个问题和@user4581301 提供的信息对于大多数通过 SO 爬行的初学者来说非常方便。