相关疑难解决方法(0)

什么是聚合和POD以及它们如何/为何特殊?

常见问题解答涉及聚合和POD,并涵盖以下材料:

  • 什么是聚合
  • 什么是POD(普通旧数据)?
  • 它们有什么关系?
  • 它们如何以及为何特别?
  • C++ 11有什么变化?

c++ aggregate standard-layout c++11 c++17

525
推荐指数
6
解决办法
13万
查看次数

以下短语在C++中的含义是什么:零,默认和值初始化?

以下短语在C++中的含义是什么:

  • 零初始化,

  • 默认初始化,和

  • 值初始化

C++开发人员应该了解他们什么?

c++ initialization c++-faq

183
推荐指数
2
解决办法
3万
查看次数

是否有编译时func /宏来确定C++ 0x结构是否为POD?

我想要一个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++ static-assert type-traits c++11

22
推荐指数
1
解决办法
3265
查看次数

这是C++ 11中的结构POD吗?

这个结构是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++ pod c++11

10
推荐指数
1
解决办法
5228
查看次数

C++:我如何使用type_traits来确定一个类是否是微不足道的?

在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)

c++ pod type-traits c++11

8
推荐指数
1
解决办法
2787
查看次数

为什么std :: atomic不仅仅是Visual C++中的普通类型?

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++ visual-c++ c++11

7
推荐指数
1
解决办法
451
查看次数

为了确保C ++类型为POD,必须遵循哪些规则?

可能重复:
C ++中的POD类型是什么?

什么是聚合和POD,它们为何/为什么特别?

我正在用C ++写一个解释器,我想确保某些C ++数据类型在通过解释的代码访问时(尤其是在使用反射时)具有可预测的布局。因此,例如,我想确保第一个数据字段始终与对象地址的偏移量为零。现在,这对于纯POD类型来说是微不足道的。但是,我想知道这是否还可以用于具有继承或构造函数的对象,只要我避免使用虚函数或多重继承之类的明显东西即可。是否合理地假设编译器将以与C编译器相同的方式布局这些类型,还是我需要担心C ++标准中的“未指定行为”?

c++ compiler-construction standards inheritance pod

6
推荐指数
1
解决办法
329
查看次数

为什么std :: string是标准布局类型?

以这里为例:琐碎与标准布局与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++ c++11

3
推荐指数
1
解决办法
477
查看次数