【发布时间】:2016-07-21 03:00:17
【问题描述】:
执行以下代码:
#include <iostream>
#include <type_traits>
struct s_ref {
int &foo;
};
struct s_ptr {
int *foo;
};
int main(int argc, char *argv[])
{
std::cout << "s_ref is_standard_layout:" << std::is_standard_layout<struct s_ref>::value << std::endl;
std::cout << "s_ptr is_standard_layout:" << std::is_standard_layout<struct s_ptr>::value << std::endl;
return 0;
}
结果:
s_ref is_standard_layout:0
s_ptr is_standard_layout:1
基于标准布局的使用(即:“标准布局类型对于与用其他编程语言编写的代码进行通信很有用”)这是有道理的,但我不确定违反了哪个规则:
标准布局类是一个类(用类、结构或 工会):
没有虚函数,也没有虚基类。
对其所有非静态数据成员具有相同的访问控制(私有、受保护、公共)。
要么在派生最多的类中没有非静态数据成员,并且最多有一个具有非静态数据成员的基类,要么没有 具有非静态数据成员的基类。
它的基类(如果有的话)本身也是一个标准布局类。
并且,没有与其第一个非静态数据相同类型的基类 会员。
编辑:引用来自:http://www.cplusplus.com/reference/type_traits/is_standard_layout/,但http://en.cppreference.com/w/cpp/concept/StandardLayoutType 也类似。
【问题讨论】:
-
你的报价来源是什么?
-
@Cheersandhth.-Alf 可能是cplusplus.com.
-
Cppreference 已修复..(我们肯定犯了错误,我想知道其他人是否抄袭了我们的)。你仍然可以争辩说它是正确的,因为它说的是标量或类,其成员是标准布局。引用类型不是标量或类。
标签: c++