类比理解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&
变量。
然后我们必须考虑各个名称 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<0>(tpl)
。 get<0>
后面很可能有一个 member_a
,但是 name member_a
可能是私有的。 member_a
也可能比 get<0>
更少 const 限定。
但是是的,对于最简单的情况,一个没有位域的简单struct
,确实会有一个对应的member_a
。
我正在尝试了解 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&
变量。
然后我们必须考虑各个名称 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<0>(tpl)
。 get<0>
后面很可能有一个 member_a
,但是 name member_a
可能是私有的。 member_a
也可能比 get<0>
更少 const 限定。
但是是的,对于最简单的情况,一个没有位域的简单struct
,确实会有一个对应的member_a
。