为什么std::string是标准布局类型?

3
从这里的例子中获取信息: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怎么可能是标准布局呢?

1
那么,如果一个类型不是标准布局,需要什么才能实现呢? - 463035818_is_not_a_number
1
我不认为标准保证了这一点? - M.M
1
这个问题有点奇怪,前提不够充分。首先,你没有说明你认为T有什么明显的“简单”之处(“只需要这些”),然后你也没有解释为什么你认为std::string具有一些T没有的特性是如此离谱。 - Lightness Races in Orbit
2个回答

9

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

[C++14: 9/7]: 标准布局类是指一个类:

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

std::string 可能没有 public 数据成员(它们可能是什么?),这就是你在使用 T 时犯错的地方(因为现在你既有 private 数据成员又有 public 数据成员;请参见粗体字部分)。

但据我所知,std::string 没有实际要求符合标准布局。这只是你的实现方式。


1
顺便给那些对“struct vs class”有疑惑的人一个小福利:“9/7:标准布局结构体是使用class-key struct或class-key class定义的标准布局类。”也就是说,它们完全一样。 - Lightness Races in Orbit
必须喜欢标准,因为它为结构体和类提供了清晰明确的定义。 - Passer By

2
根据StandardLayoutType的要求:
要求:
- 所有非静态数据成员具有相同的访问控制 - ...
这就是为什么 T 无法成为标准布局类型。std::string 只是满足了这些要求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接