【问题标题】:Why is std::string a standard layout type?为什么 std::string 是标准布局类型?
【发布时间】:2017-05-11 09:52:58
【问题描述】:

以这里为例:trivial vs. standard layout vs. POD

以下代码通过:

struct T {
public:
    int i;
private:
    int j;
};

static_assert(! std::is_standard_layout<T>::value, "");

但以下不是:

static_assert(! std::is_standard_layout<std::string>::value, "");

因此,如果类型不是标准布局所需要的一切,那么 std::string 怎么可能是一个呢?

【问题讨论】:

  • “所以如果一个类型不是标准布局所需要的一切” .. 如果需要什么?不是标准布局?
  • 我认为标准不能保证这一点?
  • 这是一个奇怪的问题,前提不充分。首先,您没有确定您发现关于T 的明显“简单”(“一切所需”),然后您没有解释为什么您认为std::string 具有T 的某些属性应该如此古怪没有。

标签: c++ c++11


【解决方案1】:

让我们看看标准布局的实际规则:

[C++14: 9/7]: 标准布局类是这样的类:

  • 没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员,
  • 没有虚函数 (10.3) 和虚基类 (10.1),
  • 对所有非静态数据成员具有相同的访问控制(第 11 条)
  • 没有非标准布局基类,
  • 要么在派生最多的类中没有非静态数据成员,并且最多有一个具有非静态数据成员的基类,要么没有具有非静态数据成员的基类,并且
  • 没有与第一个非静态数据成员相同类型的基类。

std::string 可能没有public 数据成员(它们会是什么?),这就是您的T 出错的地方(因为现在您同时拥有privatepublic 数据成员;请参阅加粗的段落)。

但据我所知,std::string 并没有成为标准布局的实际要求。这就是您的实现方式。

【讨论】:

  • 顺便说一下,对于“struct vs class”错误的处理:"9/7:标准布局结构是使用类键定义的标准布局类struct 或 class-key 类。” 即字面上完全一样的东西
  • 一定要喜欢标准,因为它为结构和类提供了清晰性
【解决方案2】:

根据StandardLayoutType的要求:

要求

  • 所有非静态数据成员都具有相同的访问控制
  • ...

这就是T 未能成为标准布局类型的原因。 std::string 刚好满足要求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 2018-06-07
    相关资源
    最近更新 更多