POD implications for a struct which holds an stand

2019-07-05 13:56发布

问题:

I came across this question recently. My goal is to understand how the C++ compiler views struct definitions which hold standard library containers such as std::vector.

Ben Voigt's answer to the linked question cites the following from the C++0x standard:

....

A trivial class is a class that has a trivial default constructor (12.1) and is trivially copyable.

[ Note: In particular, a trivially copyable or trivial class does not have virtual functions or virtual base classes. — end note ]

A standard-layout class is a class that:

  • has no non-static data members of type non-standard-layout class (or array of such types) or reference,

....

I'm almost certain that the bolded text implies that the following is undefined behavior

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
}

And the same would be the case for any type which is from the standard library, including simpler types such as std::string. This would be due to the nature of the library's design, given its large usage of inheritance and template programming.

So, while struct A would resemble that of a POD type, the fact that it contains that standard library type automatically invalidates it from that category, as far as the compiler is concerned.

Are my assumptions correct?

回答1:

No. Your basic assumptions are flawed. "Standard layout" is not related to templates. E.g. std::pair<T1, T2> has standard layout if and only if both T1 and T2 do. Same goes for std::array<T,N>

However, none of the Containers have standard layout. The whole point of their allocators is to have advanced memory management.