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;
, (Я не говорю, что это хороший дизайн!).
нет, нет никаких гарантий.
Стандарт C ++ 11 явно упоминает, когда класс должен иметь стандартную компоновку (например, mutex
класс, atomic_flag
класс и т. д.).
Слово «макет» отсутствует во всем разделе 23 (Библиотека контейнеров). Я считаю, что этого достаточно, чтобы предположить, что никаких гарантий не дано.
Других решений пока нет …