POD 对包含标准库容器的结构的影响

POD implications for a struct which holds an standard library container

本文关键字:结构 影响 包含 标准 POD      更新时间:2023-10-16

我最近遇到了这个问题。我的目标是了解C++编译器如何查看包含标准库容器(如 std::vector)的结构定义。

Ben Voigt 对链接问题的回答引用了 C++0x 标准的以下内容:

....

普通类是具有普通默认构造函数 (12.1) 并且可简单复制的类。

[ 注意:特别是,一个平凡可复制或平凡的类没有虚函数或虚拟基 类。— 尾注 ]

标准布局类是具有以下特性的类:

  • 没有非标准布局类(或此类类型的数组)类型的非静态数据成员或引用

....

我几乎可以肯定粗体文本暗示以下内容是未定义的行为

struct A 
{
    std::vector< SomeType > myVec;
    int myC;  
    A( int c ) : myC : (c) {}
};
int main( void )
{
    A one( 1 );
    A two( 2 );
    SomeType k, z;
    one.myVec.push_back( k );
    two.myVec.push_back( z );
    memcpy( &two, &one, sizeof( A ) ); // bad juju
}
来自

标准库的任何类型也是如此,包括更简单的类型,如 std::string 。这是由于库设计的性质,因为它大量使用继承和模板编程。

因此,虽然struct A类似于 POD 类型,但就编译器而言,它包含该标准库类型的事实会自动使其从该类别中失效。

我的假设正确吗?

No.你的基本假设是有缺陷的。"标准布局"与模板无关。例如 std::pair<T1, T2>具有标准布局当且仅当T1T2都这样做。std::array<T,N>也是如此

但是,没有一个容器具有标准布局。它们的分配器的全部意义在于具有高级内存管理。