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

Understand structured binding in C++17 by analogy

我正在尝试了解 C++17 中引入的结构化绑定。 cppreference 上的解释对我来说不是很明显,但看起来像

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

这里的重点是x y z不是独立定义的变量,只是return值成员的别名。 cv-auto ref-operator 适用于 return 值,而不是别名(这里的语法可能会产生误导)。例如,参见 cppreference 示例

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

如果a b c是独立定义的变量,const auto&适用于它们,c不能是const int类型。

从实际的角度来看,这个类比未能抓住的关键点是什么?

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

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

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

所以当我们将组合 [x y z] 视为变量的名称时,很明显 auto const& [x y z] 使组合成为 const& 变量。

然后我们必须考虑各个名称 xyz 的确切含义。您的问题将它们总结为

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<0>(tpl)get<0> 后面很可能有一个 member_a,但是 name member_a 可能是私有的。 member_a 也可能比 get<0> 更少 const 限定。

但是是的,对于最简单的情况,一个没有位域的简单struct,确实会有一个对应的member_a