Существуют ли какие-либо стандартные гарантии для контейнеров 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 (Библиотека контейнеров). Я считаю, что этого достаточно, чтобы предположить, что никаких гарантий не дано.