【问题标题】:Are there any standard-layout guarantees for STL-containers?STL 容器是否有任何标准布局保证?
【发布时间】: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&lt;A&gt;::value == true
但是其他编译器或标准库会发生什么?
是否有任何保证(至少可以肯定?)STL 容器不会破坏标准布局?

背景:

struct B : A { // still standard-layout
   // ... more methods (but no new variables!)
   void bar();
};

这允许使用static_cast&lt;B &amp;&gt;(a).bar(),即使是A a;。 (我并不是说这是好的设计!)。

【问题讨论】:

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

标签: c++ stl c++11 standard-layout


【解决方案1】:

,没有任何保证。

C++11 标准明确提到类必须具有标准布局(例如mutex 类、atomic_flag 类等)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 2013-03-13
    • 2010-09-15
    相关资源
    最近更新 更多