首页 > Coding > C++17 新特性:结构化绑定

C++17 新特性:结构化绑定

2024年3月29日 发表评论 阅读评论

结构化绑定定义及用法

所谓"结构化绑定", 即将指定的名称绑定到初始化器的子对象或元素上。比如有如下结构体:

那么有如下写法,直接把该结构体的成员绑定到新的变量名上:

结构化绑定支持的方式:

auto 前后可以使用 const alignas& 修饰。

结构化绑定可以用在 数组(array)、类元组(tuple-like)和成员变量上(data members)。

这么做的好处是使得代码结构更清晰,简洁易读。

细节及注意事项

1. 结构化绑定的类型

我们可以认为在结构化绑定的过程中, 其实有一个隐藏的匿名对象,就像是使用 expression 来初始化这个匿名对象的成员一样。

需要特别注意的是: 结构化绑定时,修饰符是作用在匿名对象 (e) 上,而不是作用在绑定标识 (a or n) 上的
在如下代码中:

an 的类型为 int, 只有匿名对象 e 的类型是 const auto&
因此结构化绑定不会发生类型退化(decay)。在如下代码中,a 的类型是 int[3], a2 的类型退化为 int* .

2. 关于继承

对于继承类或结构体,结构化绑定则受到的限制:所有的成员必须在同一个类中定义。即在编译期结构化绑定必须能够完全访问类中的所有成员。

3. 其它

联合体不支持使用结构化绑定。

为类支持结构化绑定

要在一个类支持结构化绑定,需要在类中实现以下代码:

下面是一个实现:
对于一个类 Person:

当我们想要为此类实现结构化绑定时,有以下方法需要实现

之后可以使用结构化绑定:

注意这里我们只实现了拷贝在结构化绑定。对于引用的结构化绑定,我们还需要再实现一套。

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.