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

时间:2014-11-27 07:38:53

标签: c++ c++11 language-lawyer c++-standard-library

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

Ben Voigt's对链接问题的回答引用了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类型,但就编译器而言,包含标准库类型的事实会自动使其无效。

我的假设是否正确?

1 个答案:

答案 0 :(得分:3)

没有。你的基本假设是有缺陷的。 &#34;标准布局&#34;与模板无关。例如。当且仅当std::pair<T1, T2>T1同时,T2才具有标准布局。 std::array<T,N>

也是如此

但是, Containers 都没有标准布局。他们的分配器的重点是拥有先进的内存管理。