1.13.4 更多
虽然我们关注的是将名称绑定到元组的元素,但结构化绑定可以在更广泛的范围内使用,因为它们还支持绑定到数组元素或类的数据成员。如果想绑定到数组的元素,则必须为数组的每个元素提供一个名称,否则声明格式不正确。下面是一个绑定到数组元素的例子:
在本例中,arr是一个包含两个元素的数组。我们首先将a和b绑定到它的元素,然后将x和y引用绑定到它的元素。对数组元素所做的更改对变量a和b是不可见的,但对x和y引用是可见的,详见将这些值输出到控制台的注释。这是因为在执行第一次绑定时创建了数组的副本并将a和b绑定到了该副本的元素。
正如我们已经提到的,还可以绑定到类的数据成员,适用的限制如下:
❍ 绑定只能用于类的非静态成员。
❍ 类不能有匿名的联合体(union)成员。
❍ 标识符的数量必须匹配类的非静态成员的数量。
标识符的绑定是按照数据成员声明的顺序进行的,其中可以包括位字段。下面是一个例子:
同样,对foo对象的更改对变量i和n是不可见的,但对ri和rn是可见的,这是因为结构化绑定中的每个标识符都成为引用类数据成员的左值的名称(就像对数组那样,它引用数组的一个元素)。但是,标识符的引用类型指向对应的数据成员(或数组元素)。
C++20标准对结构化绑定进行了一系列改进,包括:
❍ 在结构化绑定的声明中可以包含static或thread_local存储类说明符。
❍ 允许使用[[maybe_unused]]属性声明结构化绑定,一些编译器(如Clang和GCC)已经支持此特性。
❍ 允许在lambda中捕获结构化绑定标识符,所有标识符(包括那些绑定到位字段的标识符)都可以按值捕获。除了那些绑定到位字段的标识符外,所有标识符也可以通过引用捕获。
这些变化使我们能够编写以下内容:
这些示例展示了在C++20的lambda中捕获结构化绑定的各种方法。