加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C Struct未通过POD测试

发布时间:2020-12-16 06:54:13 所属栏目:百科 来源:网络整理
导读:我正在为微控制器编写代码,需要确保我的结构是POD.我以为我可以使用“成员初始化列表”来初始化成员,但这不会通过“is_pod”测试.在下面的示例中,A是POD,B和C不是.添加“D()=默认值;”到D似乎使它成为POD.但是,通过这样做,我不能再有“成员初始化列表”?结
我正在为微控制器编写代码,需要确保我的结构是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必须是 trivial type,这需要:

Has one or more default constructors,all of which are either trivial or deleted,and at least one of which is not deleted.

一个简单的构造函数有一个不执行任何操作的描述.所以“在结构本身中进行初始化”明确地反对它.

您感兴趣的硬性要求是:

  • The constructor is not user-provided (i.e.,is implicitly-defined or defaulted on its first declaration)
  • Every non-static member of class type has a trivial default constructor
    is that it has to be default,all all members constructors have

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

请注意,在声明对象时使用聚合初始化与将其设置为默认值相比存在重大差异.设置这些变量需要一些工作,POD的默认创建“不能没有”.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读