以这里为例:琐碎与标准布局与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怎么可能成为一个呢?
让我们看看标准布局的实际规则:
[C++14: 9/7]:标准布局类是一个类:
- 没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员,
- 没有虚函数(10.3),也没有虚基类(10.1),
- 对所有非静态数据成员具有相同的访问控制(第11条),
- 没有非标准布局基类,
- 或者在最派生类中没有非静态数据成员,并且最多只有一个具有非静态数据成员的基类,或者没有具有非静态数据成员的基类,并且
- 没有与第一个非静态数据成员相同类型的基类.
std::string可能没有public数据成员(他们会是什么?),这是你绊倒你的地方T(因为现在你有两个private和public数据成员;看到大胆的段落).
但据我所知,没有实际要求std::string成为标准布局.这就是您的实施方式.
| 归档时间: |
|
| 查看次数: |
477 次 |
| 最近记录: |