【发布时间】:2013-03-03 16:02:23
【问题描述】:
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;。 (我并不是说这是好的设计!)。
【问题讨论】:
-
static_cast<B&>(a).bar()的效果未定义。从某种意义上说,它可能很“有效”,它似乎在做你认为它可能做的事情,但语言定义绝不允许这样做。 -
@PeteBecker 标准布局保证基类 A 的地址与 B 的地址相同。因此至少 static_cast(&a)->bar() 必须工作.不过,我不完全确定是否使用引用
-
嗯,不,这并不意味着您可以假装基类型的对象是派生类型的对象。同样,行为未定义。
-
标准布局是关于能够将对象传递给其他语言,据推测,这些语言不知道“所有花哨的 C++ 东西”。它确实不意味着具有相同布局的标准布局对象可以被视为相同类型。该标准根本不需要这样做。
-
正如我所说:行为未定义。您可以推测您的编译器可能会做什么,而且您可能是对的。但你也可能错了。而且我认为不能保证当您将
A*传递给某个 C 函数时,您可以获得B*,因为 C 不进行继承。
标签: c++ stl c++11 standard-layout