c++ - 类比理解C++17中的结构化绑定(bind)

标签 c++ c++17 structured-bindings

我正在尝试理解 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 , yz意思是。您的问题将它们总结为

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_aget<0>后面,但是名字 member_a可能是私有(private)的。 member_a也可能比 get<0> 更少 const 限定.

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

关于c++ - 类比理解C++17中的结构化绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49795131/

相关文章:

c++ - 虚拟数组<in, 6> arr(); 失败

c++ - 用 unique_ptr 初始化 std::vector

c++ - 如何显示不带小数的整数

c++ - 为什么不能使用结构化绑定(bind)分解 lambda 表达式的捕获列表

c++ - 如何在迭代器位置后插入元素

c++ - 如何在 qt creator 和 msvc 中使用 boost 正则表达式

C++ allocator<X>::deallocate(NULL,1) 允许吗?

c++ - 为什么绑定(bind)到引用类型时 "const auto [x, y]"的行为不符合预期?

c++ - 通过 C++ 中的公共(public)函数分配私有(private)成员值