我最近遇到了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类型,但就编译器而言,包含标准库类型的事实会自动使其无效。
我的假设是否正确?
答案 0 :(得分:3)
没有。你的基本假设是有缺陷的。 &#34;标准布局&#34;与模板无关。例如。当且仅当std::pair<T1, T2>
和T1
同时,T2
才具有标准布局。 std::array<T,N>
但是, Containers 都没有标准布局。他们的分配器的重点是拥有先进的内存管理。