C++ Struct 未通过 POD 测试
Posted
技术标签:
【中文标题】C++ Struct 未通过 POD 测试【英文标题】:C++ Struct fails POD test 【发布时间】: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() : bar0
;
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
;
【问题讨论】:
方便阅读:en.cppreference.com/w/cpp/concept/PODType 重读时有点神秘。我认为您因缺少默认构造函数而被取消 POD。除非您通过显式声明默认构造函数来反击,否则声明构造函数会删除默认构造函数。 我相信你不能在 pod-type struct 中进行任何自定义初始化。 嗯...D d = 42;
编译,“成员初始化列表”是什么意思?请注意,POD 基本上是指您在 C 中获得的内容,但类可以具有非虚拟成员函数,不包括特殊的构造函数和析构函数
我在这里试过http://cpp.sh/8exzr
,它是@user4581301 和@K。基尔兹如是说。在构造函数初始化列表(冒号后的所有内容)中提供默认初始化,将使其成为非 POD。赞成这篇文章,因为我认为这个问题和@user4581301 提供的信息对于大多数通过 SO 爬行的初学者来说非常方便。
【参考方案1】:
POD 必须是trivial type,这要求:
拥有一个或多个默认构造函数,所有都是琐碎或被删除,并且至少其中一个没有被删除。
一个普通的构造函数有一个执行no action的描述。所以“在结构本身中进行初始化”是明确反对的。
您感兴趣的硬性要求是:
构造函数不是用户提供的(即,在其第一个声明中隐式定义或默认) 类类型的每个非静态成员都有一个普通的默认构造函数 是它必须是默认的,所有的成员构造函数都有
您必须在构造函数的定义中为var1
使用默认构造函数。 IE。 var1(100)
是“没有布宜诺”。 (附注:您可以使用成员 ctor,但只能以默认形式使用,例如 var1()
,这与省略它相同)。
请注意,在对象声明中使用聚合初始化与将其设置为默认值有很大的不同。设置这些变量需要一些工作,并且 POD 的默认创建“不能没有”。
【讨论】:
以上是关于C++ Struct 未通过 POD 测试的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 C# 从 C++ dll 调用 struct 中的函数
C++:TrivialStandard-Layout 和 POD
通过 Cocoapods 中的开发 pod 功能测试静态框架
测试 kubernetes go client api 调用时通过 FieldSelector spec.nodeName 过滤 Pod 的方式