【发布时间】:2016-04-26 15:56:16
【问题描述】:
正如我们所知,struct 和 class 在语言中的许多地方都可以互换。令人困惑的是,关键字本身并不一定与标准中使用的语言相对应。例如,在标准草案 N4567 [class]/10 中,
POD 结构109 是一个非联合类,它既是 普通类和标准布局类,并且没有非静态数据 非 POD 结构、非 POD 联合(或此类数组)类型的成员 类型)。类似地,POD 联合 是一个既是平凡的联合 类和标准布局类,并且没有非静态数据成员 类型为非 POD 结构、非 POD 联合(或此类类型的数组)。一个POD class 是一个 POD 结构或 POD 联合的类。
简单来说,struct 和 class 在以下情况下可以互换:
- “类”声明
- 范围枚举类型的声明
- 详细的类型说明符,除非“类”是用
union声明的
但是,struct显式不能在模板声明中用于引入类型模板参数:
template <struct T> // error
我看不出 struct 和 class 之间有任何显着差异,即使在上面的 POD 示例中也是如此,因为标准中定义的 POD 结构 可以使用 @987654331 来声明@ 或 class。
[class]/8 standard-layout struct 是一个标准布局类 用 class-key struct 或 class-key class 定义。一种 standard-layout union 是使用 class-key union 定义的标准布局类。
这似乎相当多余和令人困惑,同时引入了明显的不一致。
我有两个问题:
我遗漏了哪些技术差异可以显着区分
struct和class?这种笨拙背后的基本原理是什么?
我忽略了默认访问说明符之间的区别,因为每个人都已经知道了。
【问题讨论】:
-
您是否也感到困惑,您可以拥有
template<typename T>,但不能拥有typename T{};? -
@user2079303 和(在 C++1z 之前)
template < template<typename> class C >,但不是template < template<typename> typename C > -
@Martin:不,OP 已经知道这些差异(他已经指出了它们)。
-
我们能否把这个问题提高一个档次,询问标准是否真的规定了默认访问之外的差异?也就是说,如果您有两个标头,其中一个将类型声明为具有成员的
struct T,另一个将其声明为具有所有公共成员的class T,两者都会 link 正确地链接到实现T和T::...成员的目标文件?
标签: c++ class struct standards