C++ STL容器是否有任何标准布局保证?

C++ STL容器是否有任何标准布局保证?,c++,stl,c++11,standard-layout,C++,Stl,C++11,Standard Layout,这允许使用static_cast(a).bar()即使对于a。(我不是说这是一个好的设计!)。不,没有任何保证 C++11标准明确提到类何时必须具有标准布局(例如互斥体类、原子标志类等) “布局”一词并未出现在整个第23条(容器库)中。我相信这足以假设没有提供任何保证。静态的效果(a).bar()是未定义的。从某种意义上说,它很可能“起作用”,因为它似乎做了您认为它可能会做的事情,但它在任何意义上都不被语言定义所允许。@PeteBecker标准布局保证基类A的地址与B的地址相同。因此,至少静态_

这允许使用
static_cast(a).bar()
即使对于
a。(我不是说这是一个好的设计!)。

,没有任何保证

C++11标准明确提到类何时必须具有标准布局(例如
互斥体
类、
原子标志
类等)


“布局”一词并未出现在整个第23条(容器库)中。我相信这足以假设没有提供任何保证。

静态的效果(a).bar()
是未定义的。从某种意义上说,它很可能“起作用”,因为它似乎做了您认为它可能会做的事情,但它在任何意义上都不被语言定义所允许。@PeteBecker标准布局保证基类A的地址与B的地址相同。因此,至少静态_cast(&A)->bar()必须起作用。我不完全确定是否使用引用,但这并不意味着你可以假装一个基类型的对象是一个派生类型的对象。再次,行为是未定义的。标准布局是指能够将对象传递给其他语言,这大概不知道“所有的奇特C++”。这并不意味着具有相同布局的标准布局对象可以被视为相同类型。标准根本不要求这样做。正如我所说:行为是未定义的。你可以推测你的编译器可能会做什么,你很可能是对的。但你可能也错了。我不认为有任何保证,当你把一个
A*
传递给某个C函数时,你可以得到一个
B*
,因为C不做继承。
struct A {
   // ... some methods ...
   std::vector<int> foo;
   // ... more data members ...
};
struct B : A { // still standard-layout
   // ... more methods (but no new variables!)
   void bar();
};