根据(2003)标准对结构的定义,它是类的特殊情况,成员、函数和基类具有不同的默认访问修饰符。它还将结构的要求定义为POD-struct。
C++ 2003标准,ISO 14882第9.0.4节:
A结构是用类键结构定义的类;默认情况下,它的成员和基类(子句10)是公共的(第11条)。联合是一个用类键联合定义的类;它的成员在默认情况下是公共的,并且一次只能容纳一个数据成员(9.5)。注意: 8.5.1中描述了类类型的聚合。POD-struct是一个聚合类,它没有非POD-struct类型的非静态数据成员、非POD-并(或此类类型的数组)或引用,并且没有用户定义的复制赋值操作符和用户定义的析构函数。类似地,POD-union是一个聚合联合,它没有非POD-struct类型的非静态数据成员、非POD-并(或此类类型的数组)或引用,并且没有用户定义的复制赋值操作符和用户定义的析构函数。POD类是一个POD-结构类或POD-结合类.
根据这个定义,非POD结构和类之间唯一的区别因素是默认的访问修饰符。
下面是我可以想象到的非POD结构的目的:
backwards-compatibility
public:
很难维护。当非POD结构被其他系统假定为POD时,可能会导致疼痛,例如,当它们被传递到C和后面时。为了说明,this person ran into problems when a struct that was assumed to be POD was updated by another developer such that it was no longer POD。由于编译器在默认情况下不会静态断言POD-ness,所以当只能使用POD结构的上下文中使用该结构时,应用程序将在运行时崩溃。更糟糕的是,我可以想象(虽然我不确定这是否可能),一个非POD结构在某些需要POD的情况下工作,而在其他情况下失败,导致错误和崩溃,而这些错误和崩溃都是很难追踪的。
既然有些情况下,非POD结构会导致行为的奇异和破碎,那么非POD结构又有什么用呢?为什么结构在编译时没有静态地检查POD(通过std::is_pod在C++11或Boost等效项)?
发布于 2012-02-23 17:56:14
我认为这是一个毫无意义的历史意外,坦率地说,class
关键字根本不应该在C++中添加。哦,好吧!
如果struct
被要求是POD的话,这通常会很烦人--你通常会从一些POD开始,仅仅因为你可以就把它叫做"struct“,然后当你决定让它成为非POD的时候,就不得不在很多地方改变它。
请注意,GCC (至少直到最近)并不关心您(前进)是否在一个地方将某物声明为一个类,而在其他地方将其声明为一个结构,反之亦然。Clang抱怨这类事情(因为它完全有权这样做,尽管这确实“破坏”了一些现有的代码)。
发布于 2012-02-23 18:05:16
默认情况下,编译器不会静态断言
“POD”。
噢?
#include <iostream> // std::cout, std::endl
#include <type_traits> // std::is_pod
#include <string> // std::string, std::to_string
using namespace std;
struct A
{
int x;
};
struct B
{
string s;
};
int main()
{
static bool const a = is_pod<A>::value;
static_assert( a, "Ah..." );
static_assert( !is_pod<B>::value, "Bah!" );
}
struct
被允许为非POD语言的原因,例如上面的B
,也就是为什么该语言是这样设计的,很可能会在Bjarne的“C++的设计和演变”一书中找到。如果不是,那么很可能只有比昂人自己知道。因为C++的struct
的通用性从一开始就一直存在。
https://stackoverflow.com/questions/9424255
复制相似问题