Существуют ли какие-либо стандартные гарантии для контейнеров STL?

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;, (Я не говорю, что это хороший дизайн!).

1 ответ

Решение

Нет, никаких гарантий.

Стандарт C++11 прямо упоминает, когда класс должен иметь стандартное расположение (например, mutex класс, atomic_flag класс и т. д.).

Слово "макет" отсутствует во всем разделе 23 (Библиотека контейнеров). Я считаю, что этого достаточно, чтобы предположить, что никаких гарантий не дано.

Другие вопросы по тегам