我正在尝试理解 C++17 中引入的结构化绑定(bind)。 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
不是独立定义的变量,只是返回值成员的别名。并且 cv-auto ref-operator
适用于返回值,而不是别名(这里的语法可能会产生误导)。例如,参见 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
.结构化绑定(bind)是一种为变量的所有部分命名的方法,而整个变量没有明确的名称。所以这是组合 [x,y,z]
一起命名一个具有三个成员的变量。
重要的是,它们共同命名了一个对象,因此编译器实际上必须对对象进行布局。自变量可以独立的放在栈上。但是对于结构化绑定(bind),编译器不能这样做(正常的 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)
.很可能有一个 member_a
在get<0>
后面,但是名字 member_a
可能是私有(private)的。 member_a
也可能比 get<0>
更少 const 限定.
但是,对于最简单的情况,一个简单的 struct
没有位域,确实会有一个对应的 member_a
.
关于c++ - 类比理解C++17中的结构化绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49795131/