2017-10-20 44 views
4

我正在为微控制器编写代码,并且需要确定我的结构是POD。我以为我可以使用“成员初始值设定项列表”来初始化成员,但是这不会通过“is_pod”测试。在下面的例子中,A是POD,B和C不是。添加“D()= default;”到D似乎使它成为POD。但是,通过这样做,我不能再有一个“成员初始化列表”?有没有办法让一个结构成为一个POD,并且有一个“成员初始化列表”?C++ Struct失败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 
}; 
+2

方便阅读:http://en.cppreference.com/w/cpp/concept/PODType – user4581301

+2

这对重读有点神秘。我想你会因缺乏默认的构造函数而被解除封装。声明构造函数会除去默认构造函数,除非您通过显式声明默认构造函数来计数。 – user4581301

+2

我相信你不能在pod-type结构中有任何自定义的初始化。 –

回答

0

POD必须是trivial type,这需要:

有一个或多个默认构造函数所有这些要么琐碎或删除,以及至少一个其中没有删除。

而一个简单的构造函数有一个描述没有行动。因此,在结构本身中具有初始化的“”明确反对它。

的兴趣的硬要求是:

  • 构造方法中没有用户提供的(即,隐式定义的或默认的首次声明)
  • 的每一个非静态成员类类型有一个平凡缺省构造 是,它必须是默认情况下,所有的所有成员都构造

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

请注意,在声明对象时使用聚合初始化与将其设置为默认值存在主要区别。需要一些工作来设置这些变量,并且默认创建POD“不能没有”。