我遇到过几次POD-type这个术语。 这是什么意思?


当前回答

POD的概念和类型特征std::is_pod将在c++ 20中被弃用。有关进一步信息,请参阅此问题。

其他回答

POD代表普通旧数据——也就是说,一个没有构造函数、析构函数和虚成员函数的类(无论是用关键字struct还是用关键字class定义的)。维基百科关于POD的文章更详细一些,并将其定义为:

c++中的普通旧数据结构是一个聚合类,它只包含PODS作为成员,没有用户定义的析构函数,没有用户定义的复制赋值操作符,也没有指针到成员类型的非静态成员。

更多的细节可以在c++ 98/03的答案中找到。c++ 11改变了围绕POD的规则,极大地放松了它们,因此需要在这里进行后续回答。

普通旧数据

简而言之,它是所有内置数据类型(例如int、char、float、long、unsigned char、double等)和POD数据的所有聚合。是的,这是递归定义。;)

更清楚地说,POD就是我们所说的“结构体”:仅存储数据的单元或单元组。

POD的概念和类型特征std::is_pod将在c++ 20中被弃用。有关进一步信息,请参阅此问题。

据我所知,POD (PlainOldData)只是一个原始数据-它不需要:

要被建造, 被毁灭, 拥有自定义操作符。 必须没有虚函数, 并且不能重写操作符。

如何检查某物是否是POD?有一个结构体叫做std::is_pod:

namespace std {
// Could use is_standard_layout && is_trivial instead of the builtin.
template<typename _Tp>
  struct is_pod
  : public integral_constant<bool, __is_pod(_Tp)>
  { };
}

(来自头文件type_traits)

参考:

http://en.cppreference.com/w/cpp/types/is_pod http://en.wikipedia.org/wiki/Plain_old_data_structure http://en.wikipedia.org/wiki/Plain_Old_C++_Object 文件type_traits

POD(普通旧数据)对象具有这些数据类型中的一种——基本类型、指针、联合、结构、数组或类——没有构造函数。相反,非pod对象是存在构造函数的对象。POD对象在获得与其类型对应的适当大小的存储空间时开始其生命周期,在对象的存储空间被重用或释放时结束其生命周期。

PlainOldData类型也不能包含:

虚函数(它们自己的或继承的) 虚拟基类(直接或间接)。

PlainOldData更宽松的定义包括带有构造函数的对象;但不包括那些虚拟的东西。PlainOldData类型的重要问题是它们是非多态的。继承可以用POD类型完成,但是它应该只用于ImplementationInheritance(代码重用),而不是多态性/子类型。

一个常见的(虽然不是严格正确的)定义是PlainOldData类型是没有VeeTable的任何类型。