当前位置: 首页 > 知识库问答 >
问题:

通过类比理解C 17中的结构化绑定

胡昊
2023-03-14

我试图理解C17中引入的结构化绑定。对我来说,关于cp首选项的解释并不明显,但看起来像

cv-auto ref-operator [x, y, z] = ...

大致相当于(不考虑数组的情况)

cv-auto ref-operator unique_name = ...
#define x unique_name.member_a
#define y unique_name.member_b
#define z unique_name.member_c

这里的关键点是,xyz不是独立定义的变量,而是返回值成员的别名。和cv auto ref操作符应用于返回值,而不是别名(这里的语法可能会误导)。例如,请参见CPPPreference示例

float x{};
char  y{};
int   z{};

std::tuple<float&,char&&,int> tpl(x,std::move(y),z);
const auto& [a,b,c] = tpl;
// a names a structured binding of type float& that refers to x
// b names a structured binding of type char&& that refers to y
// c names a structured binding of type const int that refers to the 3rd element of tpl

如果abc是独立定义的变量,则const auto

从实践的角度来看,这个类比没有抓住什么关键点?


共有1个答案

何昆
2023-03-14

从另一个角度考虑这一点可能很有见地。

在C语言中,我们已经有了变量,有名字int a=5的对象,还有不是变量且没有名字的对象:*new int。结构化绑定是一种为变量的所有部分命名的方法,而整个变量没有显式的名字。所以是[x, y, z]的组合一起命名了一个有三个成员的变量。

重要的是,它们一起命名一个对象,所以编译器实际上必须布局这个对象。独立变量可以独立地放在堆栈上。但是对于结构化绑定,编译器不能这样做(除了正常的as-if规则)

因此,当我们考虑组合<代码> [Xy Z] 作为变量的名称时,很明显,<代码>自动const。

然后我们必须考虑个人名称<代码> x<代码>,<代码> y>代码>和<代码> z <代码>平均值。你的问题总结为

cv-auto ref-operator unique_name = ...
#define x unique_name.member_a
#define y unique_name.member_b
#define z unique_name.member_c

这有点棘手。member_a从哪里来?看起来unique_name有一个member_a。您已经排除了数组大小写,它有[0]。元组有get

但是是的,对于最简单的情况,一个简单的结构,没有位字段,确实会有一个相应的成员_a

 类似资料:
  • 我在这里找到了最初的*C结构化绑定方案。它提出了一种轻松绑定多个返回值的方法,即: 但现在我看到每个人都指向 现在我学习了“列表是{like,this}编写的”,出现了一种新的列表语法?为什么?这里的花括号有什么问题?

  • 在该示例中,标识符和之间的相应区别是什么?据我所知,结构绑定中的也有一个引用类型,但是为什么为它指明了一个非引用类型呢?

  • 简短版本: 我希望能够将结构转换为元组。至少是那种类型。在下面的代码中,convertToTuple函数不起作用,因为可变参数不能用于结构化绑定(据我所知)。关键是:自动 基本上,我需要的是一种将自定义结构的类型转换为元组的方法,元组包含结构中的所有类型。例如: 具体问题: 我想创建一个模板函数,它将一个类型或一个类型列表作为模板参数,并生成一个纹理列表,每个纹理包含一个项目。另一个函数可以对纹理

  • 我试图支持类的类似元组的结构化绑定访问。为了简单起见,我将在本文的其余部分使用以下类: (我知道这个类支持开箱即用的结构化绑定,但假设它不支持。) 为了能够像元组一样访问的成员,我们必须专门化和: 我们需要的最后一部分是测试:: 这是可行的。但是,我想返回对成员的引用,就像一样。因此,我实现如下: 然而,在这个版本中,以下代码 产生错误(GCC 7.1): “std::tuple_元素”类型的绑定

  • 假设我有一个类型为 是否可以像这样以嵌套的方式访问元素类型(即在Range for循环中使用时)

  • 据我所知,C 17中结构化绑定引入的标识符实际上是对某些“隐藏”变量的引用。以至于 相当于 但是,如果我打印出