gpt4 book ai didi

c++ - 为什么根据唯一命名的变量定义结构化绑定(bind)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:17:20 26 4
gpt4 key购买 nike

为什么结构化绑定(bind)是通过唯一命名的变量和所有模糊的“名称绑定(bind)到”语言来定义的?

我个人认为结构化绑定(bind)的工作原理如下。给定一个结构:

struct Bla
{
int i;
short& s;
double* d;
} bla;

以下内容:

cv-auto ref-operator [a, b, c] = bla;

(大致)等同于

cv-auto ref-operator a = bla.i;
cv-auto ref-operator b = bla.s;
cv-auto ref-operator c = bla.d;

以及数组和元组的等效扩展。但显然,这太简单了,而且所有这些模糊的特殊语言都用来描述需要发生的事情。

所以我显然遗漏了一些东西,但是在某种意义上定义明确的扩展的确切情况是什么,比方说,折叠表达式,这在标准语中更容易阅读?

似乎结构化绑定(bind)定义的变量的所有其他行为实际上都遵循我认为将用于定义概念的简单扩展“规则”。

最佳答案

存在结构化绑定(bind)以允许在一种不允许函数解析为多个值的语言中返回多个值(因此不会干扰 C++ ABI)。这意味着无论使用什么语法,编译器最终都必须存储实际的返回值。因此,该语法需要一种方式来明确如何您将存储该值。由于 C++ 在事物的存储方式(作为引用或作为值)方面具有一定的灵 active ,因此结构化绑定(bind)语法需要提供相同的灵 active 。

因此 auto &auto&&auto选择应用于主要值而不是子对象。

其次,我们不希望此功能影响性能。这意味着引入的名称永远不会是主对象的子对象的拷贝。它们必须是引用或实际的子对象本身。这样,人们就不会担心使用结构化绑定(bind)对性能的影响;它是纯粹的语法糖。

第三,该系统旨在处理用户定义的对象和具有所有公共(public)成员的数组/结构。在用户定义对象的情况下,“名称绑定(bind)到”一个真正的语言引用,调用 get<I>(value) 的结果.如果您存储 const auto&对于对象,然后是 value将是 const&到那个对象,和get可能会返回 const& .

对于数组/公共(public)结构,“名称绑定(bind)到”某些不是引用的东西。这些与您输入的内容完全一样 value[2]value.member_name .做decltype在这样的名称上不会返回引用,除非解压缩的成员本身就是一个引用。

通过这种方式,结构化绑定(bind)仍然是纯粹的语法糖:它以对该对象最有效的方式访问该对象。对于用户定义的类型,调用 get每个子对象恰好一次并存储对结果的引用。对于其他类型,这是使用类似于数组/成员选择器的名称。

关于c++ - 为什么根据唯一命名的变量定义结构化绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49797286/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com