【问题标题】:Why is a class with multiple public access specifiers standard_layout?为什么具有多个公共访问说明符的类是standard_layout?
【发布时间】:2016-12-07 03:48:11
【问题描述】:

我只是在玩 g++,我发现了

#include <type_traits>

class Foo {
public: int x;
public: char y;
public: double z;
};

static_assert(std::is_standard_layout<Foo>::value, "Foo is not standard layout");

int main() {}

编译得很好。

根据this 的回答,data members across access specifiers may be reordered in memory。所以没有保证x 必须是Foo 的第一个成员,当实际布置在内存中时。我定义Foo、y 的方式实际上可能是第一个元素,对吧?

我认为标准布局意味着您可以或多或少地了解给定类型的字节是如何布局的。允许以任意方式重新排序标准布局类型中的字段对我来说似乎违反直觉。为什么允许这样做?

【问题讨论】:

  • Foo 可能不是标准布局并不意味着Foo 不得是标准布局。即不同版本的编译器可能会选择在静态断言上失败。但如果它编译,你知道它必须是标准布局。

标签: c++ standard-layout


【解决方案1】:

结构的所有成员都具有相同的访问说明符:public。关键字出现在每个班级成员之前这一事实无关紧要。这相当于public 访问说明符在所有类成员之前出现一次。

【讨论】:

  • 那么我链接的答案不正确吗?因为这个答案表明,public 访问说明符出现不止一次确实有一些语义差异
  • 通过“我链接的答案”我的意思是这个:stackoverflow.com/questions/11362543/…
  • @math4tots 在我看来答案是错误的。来自草案 n3797 9.2 p13:分配具有相同访问控制(第 11 条)的(非联合)类的非静态数据成员,以便后面的成员在类对象中具有更高的地址所以即使私有, protected 和 public 彼此之间没有顺序所有一种类型的对象都彼此具有绝对顺序。
  • 啊,好尴尬^_^;我今天在工作中告诉某人他们是不同的......我会在下次假装我知道之前学会参考标准
  • 标准中的引用提到了排序,但没有提到这些字段是否必须是连续的(例如,私有字段仍可能插入两个公共字段之间),您是否碰巧知道是否有任何关于什么时候可以和不可以发生的语言?
猜你喜欢
  • 2011-07-23
  • 2013-06-19
  • 2020-12-05
  • 2021-11-10
  • 2013-10-22
  • 2011-01-15
  • 2013-08-11
  • 1970-01-01
  • 2011-08-30
相关资源
最近更新 更多