从这里举例: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怎么可能是一个?
答案 0 :(得分:9)
让我们看一下标准布局的实际规则:
[C++14: 9/7]:
标准布局类是一个类:
- 没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员,
- 没有虚函数(10.3),没有虚基类(10.1),
- 对所有非静态数据成员具有相同的访问控制(第11条),
- 没有非标准布局基类
- 在大多数派生类中没有非静态数据成员,并且最多只有一个具有非静态数据成员的基类,或者没有包含非静态数据成员的基类,并且
- 没有与第一个非静态数据成员相同类型的基类。
std::string
可能没有public
个数据成员(他们会是什么?),这是您使用T
绊倒的地方(因为现在您同时拥有private
和public
数据成员;见大胆的段落。
但据我所知,std::string
没有实际要求成为标准布局。这就是你的实现方式。
答案 1 :(得分:2)