此常见问题解答涉及聚合和POD,并涵盖以下材料:
以下短语在C++中的含义是什么:
零初始化,
默认初始化,和
值初始化
C++开发人员应该了解他们什么?
我想要一个C++ 0x static_assert来测试给定的结构类型是否是POD(以防止其他程序员无意中用新成员破坏它).即
struct A // is a POD type
{
int x,y,z;
}
struct B // is not a POD type (has a nondefault ctor)
{
int x,y,z;
B( int _x, int _y, int _z ) : x(_x), y(_y), z(_z) {}
}
void CompileTimeAsserts()
{
static_assert( is_pod_type( A ) , "This assert should not fire." );
static_assert( is_pod_type( B ) , "This assert will fire and scold whoever added a ctor to the POD type." ); …Run Code Online (Sandbox Code Playgroud) 这个结构是C++ 11中的POD吗?
struct B
{
int a;
B(int aa) : a(aa) {}
B() = default;
};
Run Code Online (Sandbox Code Playgroud)
请注意,这个问题是关于C++ 11的明确问题.我知道这个类不是C++ 98中的POD,也不是C++ 03.
有关C++ 11中POD的解释,请参阅普通与标准布局与POD
(受此问题的启发:是否有编译时func /宏来确定C++ 0x结构是否为POD?)
在C++ 0x中,我想确定一个类是否是平凡的/具有标准布局,所以我可以使用memcpy(),memset()等...
我应该如何使用type_traits实现下面的代码,所以我可以确认一个类型是微不足道的?
template< typename T >
bool isTrivialType()
{
bool isTrivial = ???
return isTrivial;
}
Run Code Online (Sandbox Code Playgroud)
注意:is_pod()限制太多:我希望我的类有简单的构造函数等......为方便起见.
补充:我认为std :: is_standard_layout <>可能会给我我正在寻找的东西.1.如果我添加构造函数,它仍然返回true 2.如果我添加一个虚方法,它返回false这是我需要确定我是否可以使用memcpy(),memset()
编辑:来自Luc Danton的解释和链接(澄清):
struct N { // neither trivial nor standard-layout
int i;
int j;
virtual ~N();
};
struct T { // trivial but not standard-layout
int i;
private:
int j;
};
struct SL { // standard-layout but not trivial
int i;
int j;
~SL();
};
struct POD { // both trivial and standard-layout
int i;
int j; …Run Code Online (Sandbox Code Playgroud) Folly库要求std::atomic<hazptr_obj*>应该是一个简单的类型.这适用于gcc和clang,但即使对于Visual C++也是如此std::atomic<int>.为什么要std::is_trivial回来false?
#include <type_traits>
#include <atomic>
static_assert(
std::is_trivial<std::atomic<int>>::value,
"std::atomic<int> not trivial");
Run Code Online (Sandbox Code Playgroud) 可能重复:
C ++中的POD类型是什么?
我正在用C ++写一个解释器,我想确保某些C ++数据类型在通过解释的代码访问时(尤其是在使用反射时)具有可预测的布局。因此,例如,我想确保第一个数据字段始终与对象地址的偏移量为零。现在,这对于纯POD类型来说是微不足道的。但是,我想知道这是否还可以用于具有继承或构造函数的对象,只要我避免使用虚函数或多重继承之类的明显东西即可。是否合理地假设编译器将以与C编译器相同的方式布局这些类型,还是我需要担心C ++标准中的“未指定行为”?
以这里为例:琐碎与标准布局与POD
以下代码通过:
struct T {
public:
int i;
private:
int j;
};
static_assert(! std::is_standard_layout<T>::value, "");
Run Code Online (Sandbox Code Playgroud)
但以下情况并非如此:
static_assert(! std::is_standard_layout<std::string>::value, "");
Run Code Online (Sandbox Code Playgroud)
因此,如果一个类型不是标准布局所需,那么std :: string怎么可能成为一个呢?
c++ ×8
c++11 ×6
pod ×3
type-traits ×2
aggregate ×1
c++-faq ×1
c++17 ×1
inheritance ×1
standards ×1
visual-c++ ×1