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

时间:2017-05-11 09:52:58

标签: c++ c++11

从这里举例: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怎么可能是一个?

2 个答案:

答案 0 :(得分:9)

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

  

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

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

std::string可能没有public个数据成员(他们会是什么?),这是您使用T绊倒的地方(因为现在您同时拥有privatepublic数据成员;见大胆的段落。

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

答案 1 :(得分:2)

根据StandardLayoutType的要求:

  

要求

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

这就是为什么T无法成为标准布局类型的原因。 std::string只是满足要求。