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 中的函数

struct在C和C++中的使用总结

C++:TrivialStandard-Layout 和 POD

通过 Cocoapods 中的开发 pod 功能测试静态框架

测试 kubernetes go client api 调用时通过 FieldSelector spec.nodeName 过滤 Pod 的方式

为了确保 C++ 类型是 POD,我必须遵循哪些规则? [复制]