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

Sam*_*ett 3 c++ c++11

以这里为例:琐碎与标准布局与POD

以下代码通过:

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

static_assert(! std::is_standard_layout<T>::value, "");
Run Code Online (Sandbox Code Playgroud)

但以下情况并非如此:

static_assert(! std::is_standard_layout<std::string>::value, "");
Run Code Online (Sandbox Code Playgroud)

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

Lig*_*ica 9

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

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

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

std::string可能没有public数据成员(他们会是什么?),这是你绊倒你的地方T(因为现在你有两个privatepublic数据成员;看到大胆的段落).

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