2
struct A {
   // ... some methods ...
   std::vector<int> foo;
   // ... more data members ...
};

g ++4.7とlibstdc++を使用すると、が得られstd::is_standard_layout<A>::value == trueます。
しかし、他のコンパイラや標準ライブラリはどうなりますか?
(少なくとも確実に)STLコンテナが標準レイアウトを破らないという保証はありますか?

バックグラウンド:

struct B : A { // still standard-layout
   // ... more methods (but no new variables!)
   void bar();
};

これにより、の使用static_cast<B &>(a).bar()も可能になりますA a;。(これが良いデザインだと言っているのではありません!)。

4

1 に答える 1

2

いいえ、保証はありません。

C ++ 11標準では、クラスに標準レイアウトが必要mutexな場合(クラス、atomic_flagクラスなど)が明示的に記載されています。

「レイアウト」という言葉は、第23条(コンテナライブラリ)全体には含まれていません。これは、保証が与えられていないと仮定するのに十分だと思います。

于 2013-03-03T16:30:01.523 に答える