我认为POD的全部要点(c ++ 11,简单+标准布局)是为了确保该类型与C兼容。
给出以下代码:
// that one is a standard layout, and trivial which makes it a c++11 POD
struct Bar
{
public:
int x;
public:
int y;
};
AFAIU,编译器可能会重新排序x和y。这不会破坏与C的兼容性吗?
为什么c ++ 11中的98/03 POD定义放宽被认为是个好主意?
答案 0 :(得分:4)
AFAIU,编译器可能会重新排序x和y。这不会破坏与C的兼容性吗?
在C ++ 03中,它可以。在C ++ 11中它不能。 C ++ 11的标准布局规则仅要求所有成员具有相同的访问控制。它们不必在相同的访问控制区域中声明。
为什么c ++ 11中的98/03 POD定义放宽被认为是个好主意?
我认为你误解了事情。 C ++ 11规则允许更多类型为标准布局(因此可能与C类型布局兼容),而不是更少。因此,放松规则并没有真正的缺点。
答案 1 :(得分:3)
我认为POD的全部要点(c ++ 11,简单+标准布局)是为了确保该类型与C兼容。
不完全是它的全部要点,但是,这是POD的属性之一。
// that one is a standard layout, and trivial which makes it a c++11 POD
正确。
AFAIU,编译器可能会重新排序x和y。这不会破坏与C的兼容性吗?
我们已经确定它是一个POD,这意味着编译器将保持与C的兼容性。保持与C的兼容性不会破坏与C的兼容性。
为什么c ++ 11中的98/03 POD定义放宽被认为是个好主意?
因为它没有破坏任何东西。
答案 2 :(得分:-1)
POD的重点不仅仅是确保类型与C兼容 - 请注意,具有访问说明符(public
,private
等)的类型与定义不兼容C,因为C没有访问说明符。 POD类型的主要特性是它可以被记忆。
在C ++类型中拥有多个访问说明符确实允许编译器以非指定的方式布局类型,并且这种情况已经存在了一段时间(对于C ++ 11来说并不新):
来自C ++ 03 9.2 / 12
未声明的(非联合)类的非静态数据成员 中间访问说明符被分配,以便后来的成员具有 类对象中的更高地址。分配顺序 由access-specifier分隔的非静态数据成员未指定 (11.1)。
但是,这不会使类型成为非POD - 它仍然可以是POD,而不是可以在C中移植表达的POD。