问题标签 [structured-bindings]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 结构化绑定和强制复制省略
如果您像这样使用结构化绑定
那么返回的元组中的副本是否会被删除,对象会直接进入a
,b
或者c
初始化是否会是来自单个元组元素的移动构造?我怀疑这会导致复制发生,但我不确定标准中对强制复制省略的描述是否能处理这种情况。
c++ - 解包到函数参数
理论上是否可以添加语言功能以将结构解压缩到函数实际参数列表中?我的意思是以下。
处理成员数量未知的合适结构会很方便。由于缺少模板上下文,当前的结构化绑定无法“解包”未知数量的组件(如auto... [x] = s;
)的结构,因此只能operator ...
处理可变数量的类型/值。
这种方式有什么缺点?
c++ - 还包括现有变量的 C++17 结构化绑定
这个答案列出了 C++17 分解声明的一些缺点(该功能以前称为“结构化绑定”)。例如,您不能为新变量指定显式类型,等等。但是那里没有提到我遇到的一个大缺点,所以我想知道是否有一种我没有想到的已知解决方法。
考虑这个 JSON 解析代码(可能包含其他错误;出于本问题的目的,请忽略它们):
这会很好用,除了开始auto [key, p] =
和auto [value, p] =
无效的行!该变量p
已被声明。我正在尝试分配p
一个新值,但我不想创建一个全新的局部变量。
我宁愿不使用,因为这需要我在分配之前std::tie(key, p) =
给出声明。key
这是老生常谈的反对意见std::tie
。我可以发誓这就是将结构化绑定引入语言的原因!
那么是否有任何解决方法 - 编写组合构造的任何干净的方式key
- 就地和分配给 -p
表达我的意图?
奇怪的是,我以前从未错过过这个功能,但是一旦你给我结构化绑定来玩,我尝试的第一件事就不起作用。:(
c++ - 为什么包括打破 GCC 中的结构化绑定?
考虑:
此代码在 C++17 模式下使用 gcc 7.1 编译得很好,但是这个:
给出一个错误:
这里发生了什么?编译器错误,或者这是结构化绑定应该如何工作?
c++ - 使用结构化绑定声明的变量的完美转发
我有一个结构
我正在尝试编写一个类似于std::get
for tuples 的通用函数,它采用编译时索引I
并返回I
对结构的第 -th 成员的左值引用,如果它被调用时使用左值和对第 -th 成员DemoStruct<T>
的右值引用I
如果使用 rvalue 调用该结构,则为该结构DemoStruct<T>
。
我当前的实现看起来像这样
但是,这并没有达到我的预期,T
而是总是返回一个右值引用。
这是一个显示问题的魔杖盒。
返回对保留传递给函数的结构的值类别的结构成员的引用的正确方法是什么?
编辑:正如 Kinan Al Sarmini 指出的那样,auto&& [a, b] = ...
确实推断出非引用类型a
和b
非引用类型的类型。这也适用于std::tuple
,例如两者
和
编译正常,即使std::get<0>(my_tuple)
返回引用,如下所示
这是 GCC 和 Clang 中的语言缺陷、故意还是错误?
c++ - C++17 中的初始化列表和结构化绑定推导歧义
我一直避免像下面这样的初始化
因为引用和指针限定符不适用于初始化。诚然,这是初学者学习的第一件事,与之相关的模棱两可让我觉得以下内容更清晰,读者需要更少的思考
使用 C++17 和结构化绑定,我很高兴并且看到了很多潜力。C++17 取缔了 C++14 和 C++11 未能解决的问题,auto x {1}
即 is anint
和 not std::initializer_list<int>
. 但是为什么下面的代码不起作用?
后者符合自动推导和初始化列表的新规则,右侧的表达式被视为初始化列表。但是对于以前的编译失败并出现以下错误
有什么方法可以使用结构化绑定语法同时声明 x 和 y,而不必求助于元组、对等?另外为什么上面的代码示例中的前者是格式错误的代码?该语法是否有歧义?
c++ - 为什么 std::initializer_list 不支持 std::get<>、std::tuple_size 和 std::tuple_element
为什么不std::initializer_list
支持std::get<>
和?它现在在表达式中被大量使用,例如,std::tuple_size
std::tuple_element
constexpr
如果它确实像下面这样很酷的事情是可能的
那么为什么不std::initializer_list
支持这些呢?据我所知,没有办法std::initializer_list
在运行时构造 a ,因此大小始终由用户固定。
下面是一个如何std::intializer_list<>
在编译时获取大小的示例
c++ - C++17 中的结构化绑定引入了哪些类型的标识符?
据我所知,C++17 中结构化绑定引入的标识符实际上是对某些“隐藏”变量的引用。这样
有点等价于
但是,如果我打印出来std::is_reference<decltype(a)>::value
,我会0
在第二种情况下进入第一种情况1
。这是为什么?
c++ - 结构化绑定:当某些东西看起来像引用并且行为类似于引用,但它不是引用时
昨天我在这里看到了一个关于结构化绑定的有趣问题。
我们可以总结如下。考虑下面的示例代码:
在这种情况下decltype(a)
(int
可能)是因为这个项目符号(工作草案):
if
e
是命名结构化绑定 [...] 的无括号 id 表达式,decltype(e)
是结构化绑定声明规范中给出的引用类型
这是@Curious 在评论中为感兴趣的人提供的关于魔杖盒的片段。它表明这实际上a
不是参考,仅此而已。
到目前为止,对于原始问题来说非常好,OP 问为什么它int
不是,int &
标准说这看起来是一个可以接受的答案。
无论如何,我想知道委员会为什么会这样决定。归根结底,a
指的是元组中的一个元素,我可以通过a
. 换句话说,声明a
看起来像一个引用,它的行为类似于引用,但它不是引用。
我可以忍受这个,但我想知道这背后的原因是什么。为什么decltype(a)
不能简单int &
?有没有一个世俗的人可以理解的有意义的理由?